java - 关于相互扩展的类中的重写方法的问题。

标签 java dynamic static overwrite

我正在准备 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中它当然找不到它,因为在那里它被声明为priavte。但是为什么它在A中查找,虽然只是它的静态类型是A,但它的动态类型是C呢?

最佳答案

您收到错误是因为在编译时,编译器不知道将放入 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()。但是,对没有 tell() 方法的 C 的另一个子类使用完全相同的赋值,那么您的逻辑将会失败。 AC 都没有 tell() 方法,因此程序突然调用了不存在或不可访问的方法。

关于java - 关于相互扩展的类中的重写方法的问题。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52460368/

相关文章:

php静态魔术变量设置函数

java - 嵌套 Groovy 泛型 : unexpected token on inner generic type

java - 为什么 Java 的 nio.ByteBuffer 不是可序列化的?

JavaFX - 根据窗口大小将 ScrollPane 值更改为特定量

c++ - 函数指针映射。被指向的函数是否必须是静态的?

java - 阴影/变量范围

java - Java 是运行每个条件运算符还是在 If 语句中短路?

java - Spring MVC : please explain difference between @RequestParam and @ModelAttribute

PHP运行时类修改

C 是否有允许动态函数调用的解决方法?