【问题标题】:Question about overwritten methods in classes that extend each other.关于相互扩展的类中的覆盖方法的问题。
【发布时间】:2019-02-26 20:18:05
【问题描述】:

我正在准备 Java 考试,有一个关于静态和动态类型的问题。

我有 4 个班级:A、B、C 和 Main。

public class A {
   private void tell(){
   System.out.println("AA");
    }
}

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

public class C extends B {

}

public class Main{
public static void main(String[] args) {
    A c = new C();       
    c.tell();
}

}

我的建议是:输出应该是“BB”,因为 c 具有动态类型 C。由于 C 没有“tell”方法,所以使用上层 B 的方法,它会打印“BB”。

然而结果是一个错误,因为Java在A中寻找“tell”。在A中它当然找不到它,因为它被声明为private。但是为什么在A里面看,虽然只是静态类型是A,而动态类型是C呢?

【问题讨论】:

    标签: java dynamic static overwrite


    【解决方案1】:

    您收到错误是因为在编译时,编译器不知道将放入 A 中的实际实例,因此当编译器看到 c.tell() 他只查看确实没有的类 A一个可访问的tell() 方法。

    通过以下示例可以理解这一点:

    public class A {
      private void tell(){
          System.out.println("AA");
      }
    }
    
    public class B extends A {
      public void tell(){
          System.out.println("BB");
      }
    }
    
    public class C extends A {
    
    }
    
    public class Main{
      public static void main(String[] args) {
          A b = new B();      
          b.tell();
          A c = new C();       
          c.tell();
      }
    
    }
    

    您可以看到前两行是可以的(根据您当前的思维逻辑)。 B 有方法tell() 所以b 应该可以调用tell()。但是使用与 C 的另一个子类完全相同的分配,它没有 tell() 方法,那么你的逻辑就会失败。 AC 都有 tell() 方法,所以程序突然调用了一个不存在或不可访问的方法。

    【讨论】:

      猜你喜欢
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多