gpt4 book ai didi

java - 为什么子类对象使用父类方法会导致错误?

转载 作者:行者123 更新时间:2023-12-02 01:03:00 25 4
gpt4 key购买 nike

我目前正在上一门关于 Java 的类(class),并试图理解我遇到的一个问题。假设有以下代码:

public class Parent
{
public Parent()
{}
}
public class Child extends Parent
{
private int num;
public Child
{
super();
num = 1;
}
public int getNum()
{
return num;
}
}

然后,在来自 ParentChild 的单独类中:

Parent a = new Child();
System.out.print(a.getNum());

它应该提供以下输出:

1

根据我的了解,这应该不会出现错误,因为代码的 new Child() 部分应该指示对象是哪个类的实例,以及 Parent a 部分应在内存中为名为“a”的 Parent 对象留出空间,Child 对象能够填充该空间,因为它是父类的子类。事实上,这个空间是为 Parent 对象保存的,如果一个方法同时出现在具有不同描述的 Parent 类和 Child 类中,则该方法的描述Parent 类的方法描述优先于 Child 类的方法描述(如果为 a 留出空间,则相反的描述将优先) code> 用于 Child 对象(因此 Child a = 等))。

但是,我也被告知这种情况会导致错误。我觉得我对整个继承有一些严重的误解,尽管我看到的每一个地方似乎都给了我不同的答案和相互矛盾的数据(这很可能是由于对语言缺乏经验,尽管信息仍然没有得到解决,因为这个的)。有人愿意解释为什么这段代码提供了它所提供的响应,以及我应该如何更改这段代码中的某些内容以使其提供预期的输出以及为什么新代码有效?预先感谢您。

最佳答案

下面给出的行不会被编译,因为您尚未在 Parent 中定义 getNum()

Parent a = new Child();
System.out.print(a.getNum()); // Won't be compiled

一旦您在 Parent 中定义了 getNum(),例如如下所示

public int getNum() {
return 0;
}

以下几行将成功编译,您将得到 1 作为输出

Parent a = new Child();
System.out.print(a.getNum());

在这种情况下,引用a将能够解析getNum(),然后它将检查它所指向的实例。由于它指向 Child 的实例,因此它将返回 1(来自 Child 版本的 getNum())。

如果您尚未在 Parent 中定义 getNum() 并且仍想使用其引用调用 getNum(),则需要将引用强制转换为Child,如下所示,即可成功编译并执行:

Parent a = new Child();
System.out.print(((Child) a).getNum());

输出:

1

关于java - 为什么子类对象使用父类方法会导致错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60419529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com