Java继承和后期绑定,为什么int id具有父类值而不是子类1?

时间:2016-02-15 15:15:54

标签: java inheritance

确定输出:

public class Test1{
    public static void main(String args[]){
        ChildClass c = new ChildClass();
        c.print();
    }
}

class ParentClass{
    int id = 1;
    void print(){
       System.out.println(id);
    }
}

class ChildClass extends ParentClass{
    int id = 2;
}

我知道答案是1,我猜这是因为因为ChildClass中没有覆盖打印功能,所以它与ParentClass中的定义相同。为什么ID不是子类中给出的ID,因为Java使用后期绑定?

4 个答案:

答案 0 :(得分:6)

对象字段没有动态调度,只有方法。

答案 1 :(得分:2)

print方法的唯一版本位于Parent类,并且只有Parent id字段的可见性。

要打印Child的ID,您必须@Override print方法使用完全相同的惯用法,这将打印Child 1}}如果存在,则在ChildParent id字段的实例上调用时,如果可见,则为id已在Child中声明。

示例

如果您将此代码添加到ChildClass

void print() {
   System.out.println(id);
}

ChildClass现在声明int id = 2print实例上ChildClass的任何调用都会打印2

或者,ChildClass未声明idprint将打印1提供的ParentClassChildClass位于同一个套餐中(您的id ParentClass中的EAGER字段是默认访问权限。

答案 2 :(得分:2)

因为第二个id字段声明隐藏第一个,而不是覆盖它。

班级ChildClass两个名为id字段,每个字段都可以super.idthis.id访问。

答案 3 :(得分:1)

在父级中使id受保护,然后更改子构造函数中的值。