我知道在方法重写的情况下会发生多态。
但是我对以下内容有些困惑。
class A {
public void hi() {
System.out.println("A "+this.getClass().getName());
}
}
class B extends A {
public void bye() {
System.out.println("B "+this.getClass().getName());
}
}
class Ideone {
public static void main (String[] args) throws java.lang.Exception {
A a = new B();
a.hi();
a.bye();
}
}
输出:
Main.java:35: error: cannot find symbol
a.bye();
^
symbol: method bye()
location: variable a of type A
1 error
为什么这会产生编译时错误?
在
a = new B()
中,B
类对象是在运行时创建的,因此a
是指向类型为B
的对象的引用变量。现在,如果我们调用
B
的类方法bye()
,为什么它是编译器时间错误? 最佳答案
a
变量在运行时可能包含类A
或A
的任何子类的实例。因此,只能为该变量调用类A
的方法。
编译器在确定哪些方法调用有效时仅关心变量的编译时类型。