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

dro*_*y11 7 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;
}
Run Code Online (Sandbox Code Playgroud)

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

cad*_*ian 6

对象字段上没有动态分派,仅在方法上.

  • 相反,有[`hidden`](https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#d5e12172). (3认同)

Men*_*ena 2

该方法的唯一版本print在类中,并且仅在的字段Parent上可见。Parentid

为了打印 的Childid,您必须使用完全相同的习惯用法,当在 , 的实例上调用时,该方法将打印 的@Overrideid (如果存在),或者的字段(如果可见并且没有声明)。printChildChildParentididChild

例子

如果您将此代码添加到您的ChildClass:

void print() {
   System.out.println(id);
}
Run Code Online (Sandbox Code Playgroud)

要么按照现在的方式ChildClass进行声明,并且对实例的任何调用都将打印。int id = 2printChildClass2

或者,ChildClass不声明id并将print打印1提供的ParentClass并且ChildClass位于同一包中(您的id字段是默认访问的ParentClass)。