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