首页 > 解决方案 > 为什么子类对象使用的父类方法会导致错误?

问题描述

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

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

然后,在一个单独的类中Parentor Child

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

它应该提供以下输出:

1

据我所知,这应该运行没有错误,因为new Child()代码的一部分应该指示对象是哪个类的实例,并且该部分应该在内存中为一个名为“a”的对象Parent a留出空间,该对象是一个对象将能够填充,因为它是 Parent 类的子类。为 Parent 对象保存该空间这一事实简单地表明,如果一个方法出现在具有不同描述的类和类中,则类的方法描述将优先于类对方法的描述(并且如果留出的空间是用于对象(ergo等),则相反的描述将具有优先权。ParentChildParentChildParentChildaChildChild a =

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

标签: javainheritance

解决方案


下面给出的行将不会被编译,因为您尚未getNum()Parent.

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

一旦你定义getNum()如下Parent

public int getNum() {
    return 0;
}

以下行将编译成功,您将获得1输出

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

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

如果你还没有定义getNum()inParent并且仍然想getNum()使用它的引用调用,你需要将引用转换Child为如下,然后它将被编译并成功执行:

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

输出:

1

推荐阅读