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

Java继承和后期绑定,为什么int id有父类值而没有子类值?,java,inheritance,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 e

确定输出:

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,我猜这是因为打印函数在
子类
中没有被覆盖,它的定义与
父类
中的定义相同。既然Java使用后期绑定,为什么ID不是子类中给定的ID

在对象字段上没有动态分派,只有在方法上。

在父类中保护id,然后在子构造函数中更改值。

唯一版本的
print
方法在
父类中,它只在
父类的
id
字段上可见

为了打印
的id,您必须
@覆盖
打印
方法,使用完全相同的习惯用法,当在
实例上调用时,该方法将打印
的id(如果存在),或
父项
id
字段,如果该字段可见且在
子项
中未声明
id

示例

如果将此代码添加到您的
子类中

void print() {
   System.out.println(id);
}
ChildClass
像现在一样声明
int id=2
,并且在
ChildClass
实例上调用
print
将打印
2


或者,
ChildClass
不声明
id
print
将打印
1
,前提是
ParentClass
ChildClass
在同一个包中(您的
id
字段是
ParentClass
中的默认访问权限)

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


Class
ChildClass
有两个名为
id
的字段,每个字段都可以作为
super.id
this.id

访问,但是有一个.Quick问题,如果在ChildClass()中重写的parentClass中定义了hello()函数,并且调用了hello()函数,它将使用childClass()中定义的hello()类,因为方法上有动态分派,对吗?@drossy11不客气。还可以看看其他答案(理论性更强,但值得考虑):要点是字段被隐藏,方法被重写。快速提问,如果在childClass()中重写的父类中定义了hello()函数,并且在类parentClass()的构造函数中调用了hello()函数它将使用childClass()中定义的hello()类,因为方法上有动态分派,对吗?@drossy11是的。动作中的虚拟方法调用:被重写的方法将在实现的地方被调用(例如,在
子类中
),即使从父类构造函数调用,只要实例是
子类
。在父类中保护id不会更改输出的值。它仍然是1,因为父类的“隐藏”或“阴影”效果不一致。子级可以更改构造函数中的值,除非父级更改它,否则它将在类中保持。