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()

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

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();
,我就不必这样做了。我已经添加了一些详细信息。我希望,这会有所帮助。