为什么使用超类引用调用子类方法时会出现编译时错误?

2024-01-11

我知道多态性发生在方法重写的情况下。 但我对下面的内容有点困惑。

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();
    }
}

Output:

Main.java:35: error: cannot find symbol
        a.bye();
         ^
  symbol:   method bye()
  location: variable a of type A
1 error

为什么这会出现编译时错误?

In a = new B(), the B类对象是在运行时创建的,所以a是指向类型对象的引用变量B.

现在如果我们打电话B的类方法bye(),为什么会出现编译时错误?


The a变量可以在运行时包含类的实例A或任何子类A。因此,只能调用类的方法A对于该变量。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用超类引用调用子类方法时会出现编译时错误? 的相关文章

随机推荐