0

考虑以下类:

public class A {
    public void foo() {
        System.out.println("A.foo()");
    }

    public void bar() {
        System.out.println("A.bar()");
        foo();
    }
}

public class B extends A {
    public void foo() {
        System.out.println("B.foo()");
    }

    public static void main(String[]
    args) {
        A a = new B();
        a.bar();
    }
}

这段代码的输出是A.bar()然后B.foo()。我注意到如果我将方法 foo() 的访问级别从public更改private为输出是:A.bar()然后A.foo().

为什么?

4

1 回答 1

2

如果A.foo()是私有的,那么它不能被子类覆盖——任何其他类基本上应该不知道私有成员的存在。您不能覆盖您无法“看到”的成员。

JLS 的第 8.4.8.1 节

在 class 中声明或由 class 继承的实例方法 m CC覆盖在 class 中声明的C另一个方法 m AA,当满足以下所有条件时:

  • ...

  • 以下情况之一为真:

    • m A是公开的。
    • m A受到保护。
    • m A在与 相同的包中声明为具有包访问权限C,并且C声明 m C或 m A是 的直接超类的成员C
    • m A被声明为具有包访问权限,并且 m C从某个超类中覆盖 m AC
    • m A被声明为具有包访问权限,并且 m C覆盖了一个方法 m' 来自C(m' 不同于 m C和 m A),这样 m' 覆盖了某个超类的m AC
于 2014-07-06T08:59:46.367 回答