public class AbcMain {
public static void main(String[] args) {
Parent p = new Child();
p.sayHello();
System.out.println(p.a);
}
}
class Parent{
int a = 10;
public void sayHello(){
System.out.println("Hello inside parent.");
}
}
class Child extends Parent{
int a = 20;
public void sayHello(){
System.out.println("Hello inside child. ");
}
}
输出是:孩子里面的你好。 10
在这里混淆,它调用Child()的方法,因为实例是child。那为什么它打印a = 10?
答案 0 :(得分:2)
在java方法中,覆盖就在那里。没有variable
覆盖。
仅用于测试将父项中的变量名称更改为parentA
并查看:)
答案 1 :(得分:1)
您的Parent p
是Child
类型。现在p
是Child
个实例。所以现在你要调用Child
的属性。 Child
将覆盖Parent
sayHello
方法。
您应该了解Java polymorphism和inheritance。
答案 2 :(得分:1)
Java中没有“覆盖”字段,因为有方法。所以你可以认为,因为Child
overrode satHello
只存在一个方法实例(对于其他类的透视)。但是,对于字段,两个实例都存在。因此Parent.a = 10
和Child.a = 20
。由于p被声明为Parent
,你得到10。
答案 3 :(得分:0)
由于对象类型为Parent
,p
将具有Parent
的所有特征。但是,由于创建的对象是Child
,因此将使用Child
类中的任何重写方法,而不是Parent
类中的方法。这就是为什么你得到Hello inside child
作为第一个输出。
因为,Child
是Parent
的子类,首先,Child
默认构造函数将被调用,因此a
被初始化为20
,然后将调用Parent
默认构造函数,变量a
中的值变为10
,因此您将获得第二个输出10
(Child
中的第一行默认情况下,{1}}构造函数为super()
,除非您使用Child
调用this()
的重载构造函数。