考虑以下课程:
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()
。
为什么?
答案 0 :(得分:2)
如果A.foo()
是私有的,那么子类不能覆盖它 - 任何其他类基本上都不应该知道私有成员的存在。您无法覆盖无法“看到”的成员。
在类
C
中声明或继承的实例方法m C ,覆盖C
在类{{}中声明的另一个方法m A 1}},如果满足以下所有条件:
...
以下其中一项是正确的:
- m A 是公开的。
- m A 受到保护。
- m 使用与
的直接超类的成员A
相同的包中的包访问声明,并且C
声明m C 或m 是C
。- m 使用包访问声明,并且m C 覆盖某个超类
C
的m A 。- m 使用包访问声明A ,并且m C 覆盖
C
的方法m'(m'与m C不同和m A ),这样m'覆盖某个超类C
的m A 。