我目前正在上一门有关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
或之外的单独类中Child
:
Parent a = new Child();
System.out.print(a.getNum());
应该提供以下内容的输出:
1
从我了解到,这应该没有错误运行,因为new Child()
代码的部分应该规定的对象是什么类的一个实例,以及Parent a
部分应预留内存空间的Parent
配音对象“A”,其中一个Child
对象由于它是Parent类的子类,因此将能够填充。为Parent对象保留此空间的事实只是表明,如果在Parent
类和Child
类中都使用不同的描述来显示方法,则Parent
类的方法描述将优先于Child
类的方法描述(并且如果a
为Child
对象留出的空间是一个对象(Child a =
例如,人为等),则相反的描述将具有优先权。
但是,我也被告知,这种情况将导致错误。我觉得我对整个继承存在着严重的误解,尽管我看上去到处似乎都能给我不同的答案和相互矛盾的数据(这很可能是由于对语言的不熟练,尽管信息仍然没有得到传达,因为这个的)。有人愿意解释为什么这段代码提供了它的响应,以及我应该如何更改这段代码中的某些内容以使其提供预期的输出以及新代码为什么起作用?先感谢您。
下面给出的行将不会被编译,因为您尚未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()
,Parent
但仍要getNum()
使用其引用进行调用,则需要将引用转换Child
为以下内容,然后它将成功编译并执行:
Parent a = new Child();
System.out.print(((Child) a).getNum());
输出:
1
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句