当前位置: 首页 > 面试题库 >

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

程胤运
2023-03-14
问题内容

我对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。编译器不在乎在执行时变量的 是什么-它仅使用有关已声明类型的信息。

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


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

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

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



 类似资料:
  • 问题内容: 我有这样的代码: 为什么我不能在第(5)行中打电话;在第(6)行中将为哪个类调用? 问题答案: 您不能这样做,因为子类的方法不在您的超类中。在这种情况下,尽管String是Object的子类,因为在java.lang.Object类中未声明length(),但无法在其实例上调用length。 但是equals()方法在字符串类中被覆盖,因此将调用Strings的equals()

  • 问题内容: 我正在学习Java入门课程,我们才刚刚开始学习继承。我正在完成一项任务,要求我们创建一个具有名称和年龄的“宠物”超类。和三个子类,每个子类都有自己的独特特征(我选择了“狗”,“猫”和“鸟”)。构建完所有这些之后,我们将创建一个Main类来测试所有内容,这就是我遇到问题的地方。我试图在中调用这些独特特征的方法,但似乎只能找到超类中的方法。 这是主类: 这是我的超人 这是子类之一(它们看起

  • 我正在学习java入门课程,我们刚刚开始学习继承。我正在做一项任务,要求我们创建一个具有名称和年龄的“Pet”超类;和三个子类,每个都有自己独特的特征(我选择了“狗”、“猫”和“鸟”)。在我们构建了所有这些之后,我们将创建一个主类来测试一切,这就是我遇到问题的地方。我试图为这些独特的特性调用

  • 我有一个名为User的抽象类和一个扩展User的子类。User类包含一个方法:受保护的抽象空setId(String newId){}:它在User类中设置一个私有变量id。所以我的问题是,当我去创建setId()方法时,如果User类中的id是私有的,我如何引用它?据我所知,id变量不能被设置为受保护的。感谢任何能帮忙的人!

  • 问题内容: 一本书的引用: 如果要从超类的变量引用的对象中调用由子类定义的方法,该怎么办?假定SoftBall类具有一个名为BallBall类未定义的方法riseBall。如何从Ball变量中调用它?一种方法是创建子类的变量,然后使用赋值语句强制转换对象: 在上面的代码片段中,它显示了一个新的 Softball 对象,该对象正在创建并分配为对变量 b 的引用,这是完全合法的,因为类 Softbal