我只是想知道为什么 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/