为什么类变量的行为与继承中的方法不同?

时间:2013-11-25 10:37:45

标签: java inheritance

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?

4 个答案:

答案 0 :(得分:2)

在java方法中,覆盖就在那里。没有variable覆盖。

仅用于测试将父项中的变量名称更改为parentA并查看:)

答案 1 :(得分:1)

您的Parent pChild类型。现在pChild个实例。所以现在你要调用Child 的属性。 Child将覆盖Parent sayHello方法。

您应该了解Java polymorphisminheritance

答案 2 :(得分:1)

Java中没有“覆盖”字段,因为有方法。所以你可以认为,因为Child overrode satHello只存在一个方法实例(对于其他类的透视)。但是,对于字段,两个实例都存在。因此Parent.a = 10Child.a = 20。由于p被声明为Parent,你得到10。

答案 3 :(得分:0)

由于对象类型为Parentp将具有Parent的所有特征。但是,由于创建的对象是Child,因此将使用Child类中的任何重写方法,而不是Parent类中的方法。这就是为什么你得到Hello inside child作为第一个输出。

因为,ChildParent的子类,首先,Child默认构造函数将被调用,因此a被初始化为20,然后将调用Parent默认构造函数,变量a中的值变为10,因此您将获得第二个输出10Child中的第一行默认情况下,{1}}构造函数为super(),除非您使用Child调用this()的重载构造函数。