我知道在方法重写的情况下会发生多态。
但是我对以下内容有些困惑。

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变量在运行时可能包含类AA的任何子类的实例。因此,只能为该变量调用类A的方法。

编译器在确定哪些方法调用有效时仅关心变量的编译时类型。

09-16 04:38
查看更多