解释下面java代码的输出

时间:2017-04-19 14:20:04

标签: java oop inheritance

有人可以解释为什么输出到下面的问题是“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();

   }

}

2 个答案:

答案 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方法。