超类引用无法在Java中调用子类方法

妮基·夏玛(Nikhil Sharma)

我对Java中的多态性有基本的疑问。我已经在一个名为AnimalTestDrive.java的文件中编写了以下代码。根据我的说法,以下代码应专门以粗体显示该行,但不幸的是,它不能。您能否解释为什么,我给出了以下错误:

class Dog extends Animal {

    public void dogMethod() {
        System.out.println("In Dog method");
    }
}

public class AnimalTestDrive {
    public static void main(String args[]) {
        Dog d = new Dog();
        d.dogMethod();
        d.animalMethod();

        Animal animal = new Animal();
        animal.animalMethod();

        animal = d;
        **animal.dogMethod(); // THIS IS NOT WORKING**

    }
}
乔恩·斯基特

让我们尝试以与编译器相同的方式查看这一行:

animal.dogMethod();

首先,它需要弄清楚是什么animal意思。很好而且很容易-它是当前方法中的局部变量,因此它不需要花很多时间。

该变量的编译时类型为Animal编译器不在乎在执行时变量什么-它仅使用有关已声明类型的信息。

因此,它就是用来尝试查找,即typedogMethod()上下文中的含义的方法首先它查找,然后是(的隐式超类)-但这些类都不包含的声明到那时,编译器不得不放弃一个错误-它找不到方法。该方法可在该值所引用的对象执行时类型上使用它只能在编译时使用编译时可用的信息来绑定它。animalAnimalAnimaljava.lang.ObjectAnimaldogMethodanimal

执行唯一的决定是使用哪种方法的实现-例如,如果您调用了animal.toString()并且Dog该类具有重写,例如

@Override public String toString() {
    return "I'm a dog";
}

那么编译器会发现toString(),从方法java.lang.Object,所以它会知道该方法调用是有效的-但在执行Dog会因为对象的运行时类型的使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

确定用于调用子类中的方法的超类引用

Java:从超类构造函数中的子类调用的方法

您如何在Java中从超类调用子类方法?

Java继承:在超类中调用子类方法

从 Java 中超类类型的 ArrayList 调用子类方法

从超类调用子类方法

如何确保某些方法从子类(Java)中的方法从抽象超类中调用

如何在Groovy中从静态超类方法引用子类

如何从修饰的子类方法中调用重写的超类方法

在Java中,“ this”在继承该方法的子类上调用的超类方法中表示什么?

当引用为超类类型时,子类无法访问超类的受保护方法

java-从动态转换的超类调用子类方法

为什么从子类的超类调用方法中获得“ this”?

从超类对象数组中调用子类方法

在向量C ++中从超类调用子类方法

Java继承问题。在超类数组中调用子类方法不会编译

从Java中的子类构造函数调用超类

有没有更简单的方法可以在Java中的子类和超类的ArrayList上调用子类的方法

调用超类方法而不是子类方法

NSNotificationCenter从超类或子类调用方法?

如何使子类自动调用超类方法

Java:在超类方法签名中返回子类

Java在超类方法中返回不带通用参数的子类

当子类对象存储在超类数组中时,如何调用子类方法?

在调用超类的构造函数之前,有什么方法可以在Java中初始化子类的成员变量?

Java:强制子类重写超类的方法

对超类对象的子类引用

Java反射:从超类继承的类中调用GetDeclaredFields()方法

在子类的方法中本地调用超类方法时,使用“ super”关键字还是使用超类实例?