【问题标题】:Explain the output of below java code [duplicate]解释以下java代码的输出[重复]
【发布时间】:2017-04-19 14:20:04
【问题描述】:

谁能解释为什么下面问题的输出是“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();

   }

}

【问题讨论】:

  • 提示:下次尝试使用您最喜欢的搜索引擎 ;-)

标签: java oop inheritance


【解决方案1】:

A 类的test() 方法不能被B 类覆盖,因为它是private。因此this.test(); 调用Atest() 方法,即使它是在B 类的实例上执行的。

【讨论】:

    【解决方案2】:

    超类可以调用子类的方法而不使用类型转换、不使用反射和不使用this以外的引用,只有当它们被覆盖时。

    在您的情况下 A a = new B(); ,创建 B 的对象,它具有由超类 A 继承的 private void test() 以及由 B 添加的 protected void test() 的行为。这两种方法都存在而不仅仅是一种方法的原因是由于访问修饰符为private,该方法在子类范围内不可见。因此它不能覆盖并添加具有相同名称的方法只是简单地添加另一个方法。

    由于在这种情况下没有运行时多态性,因此编译时目标方法被解析并调用A 中定义的方法。

    如果您已经覆盖了B 中的mytest,并且从覆盖的mytest 中调用了test,那么将调用B 中的方法。这很容易理解,因为B 的任何方法都看不到其父类的任何private 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多