java - 为什么 Java 编译器决定您是否可以根据 “reference” 类型而不是实际的 “object” 类型来调用方法?

标签 java

我只是想知道为什么 Java 编译器决定您是否可以根据“引用”类型而不是实际的“对象”类型来调用方法?为了解释我想引用一个例子:

class A {
void methA() {
    System.out.println("Method of Class A.");
} 
}

class B extends A {
void methB() {
    System.out.println("Method of Class B.");
}
public static void main(String arg[]) {
    A ob = new B();
    ob.methB();       // Compile Time Error
}
}

这将产生一个编译时错误,即方法 methB()class A 中找不到,尽管对象引用“ob”包含 class B 的对象 由方法 methB() 组成。原因是 Java 编译器检查 Class A(引用类型)中的方法,而不是 Class B(实际对象类型)中的方法。所以,我想知道这背后的原因是什么。为什么 Java Compiler 会在 A 类中查找方法而不是在 B 类中(实际对象类型)?

最佳答案

假设您有一个Animal 类和一个Dog 类,扩展 Animal。现在,如果 Animal 定义了一个名为 speak() 的方法,而 Dog 定义了一个名为 bark() 的方法。如果你这样做:

Animal a = new Dog();

这意味着您指着一只狗并说它是一只动物。当您将 Dog 视为 Animal(而不是 Dog)时,您只能调用为 Animal 而不是 Dog 定义的方法。

在编译期间,编译器检查被调用的方法是否在引用类型中定义。

关于java - 为什么 Java 编译器决定您是否可以根据 “reference” 类型而不是实际的 “object” 类型来调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25581065/

相关文章:

java - 使用多线程 TransferFromLocal 到 hadoop hdfs

Java RMI 和远程文件访问

java - Apache 服务器未启动,但在 Eclipse 中显示正在启动

java - 为什么Java中哈希表(Hashtable)中的 't'不是大写

java - 当我在 scala 中运行删除查询时没有任何反应

java - 使用 char 数组将字符串转换为 int

java - 在OOP中,写子类的时候是不是要改掉原来的main方法代码?什么代替?

java - 检测列表中的最后一个文件夹

java - 如何在 Eclipse 中编辑工作区的位置?

java - 将顶点放入顶点缓冲区时出现 BufferOverFlowException