Java 为什么子类对象使用的父类方法会导致错误?
我目前正在学习一门关于Java的课程,试图理解我遇到的一个问题。假设有以下代码:Java 为什么子类对象使用的父类方法会导致错误?,java,inheritance,Java,Inheritance,我目前正在学习一门关于Java的课程,试图理解我遇到的一个问题。假设有以下代码: public class Parent { public Parent() {} } public class Child extends Parent { private int num; public Child { super(); num = 1; } public int getNum()
public class Parent
{
public Parent()
{}
}
public class Child extends Parent
{
private int num;
public Child
{
super();
num = 1;
}
public int getNum()
{
return num;
}
}
然后,在一个独立于父类
或子类
的类中:
Parent a = new Child();
System.out.print(a.getNum());
应提供以下输出:
1
据我所知,这应该不会出错,因为代码的new Child()
部分应该说明对象是哪个类的实例,而Parent a
部分应该在内存中为名为“a”的Parent
对象留出空间,而Child
对象可以填充该对象,因为它是父类的子类。为父对象保存此空间的事实简单地说明,如果方法同时出现在具有不同描述的Parent
类和Child
类中,则Parent
类的方法描述将优先于该方法的Child
类的描述(如果为a
预留的空间用于子对象(因此子对象a=
等),则相反的描述将具有优先权)
然而,也有人告诉我,这种情况会导致错误。我觉得我对整个继承有着严重的误解,尽管我所看到的每个地方似乎都给了我不同的答案和相互矛盾的数据(这很可能是由于缺乏该语言的经验,尽管由于这一原因,信息仍然无法被理解)。是否有人愿意解释为什么此代码会提供它所提供的响应,以及我应该如何更改此代码中的某些内容以使其提供预期的输出,以及为什么新代码可以工作?请提前感谢。由于您尚未定义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
(来自getNum()
的子版本)
如果您尚未在Parent
中定义getNum()
,并且仍然希望使用其引用调用getNum()
,则需要将引用强制转换为Child
,如下所示,然后它将被编译并成功执行:
Parent a = new Child();
System.out.print(((Child) a).getNum());
输出:
1
我认为这是一个很好的起点。因此,对于一个子类来说,要想拥有自己的任何方法,子类必须在超类中有相同的命名方法来覆盖它?在这一点上,如果我将object
a
声明为Child a=new Child();
,我就不必这样做了。我已经添加了一些详细信息。我希望,这会有所帮助。