有人可以解释为什么输出到下面的问题是“A.test”?
class A {
private void test(){
System.out.println("A.test");
}
public void mytest(){
this.test();
}
}
class B extends A{
protected void test(){
System.out.println("B.test");
}
}
public class Test{
public static void main(String[] args) {
A a = new B();
a.mytest();
}
}
答案 0 :(得分:2)
类test()
的{{1}}方法无法被类A
覆盖,因为它是B
。因此,private
会调用this.test();
A
方法,即使它已在类test()
的实例上执行。
答案 1 :(得分:0)
超级类可以在不使用类型转换的情况下调用子类的方法,不使用反射,只有在重写时才使用this
以外的引用。
在您的案例A a = new B();
中,创建了B
的对象,其中包含超级private void test()
和A
继承的行为protected void test()
由B
添加。这两种方法存在的原因不仅仅是因为acess修饰符为private
,因此该方法在子类范围内不可见。因此,它不能覆盖并添加具有相同名称的方法只是添加另一个方法。
由于在这种情况下没有运行时多态,因此解析了编译时目标方法,并调用A
中定义的方法。
如果您要覆盖mytest
中的B
和覆盖mytest
,则可以调用test
,然后B
中的方法本来应该被调用。这很容易理解,因为B
的任何方法都看不到其超类的任何private
方法。