Java字段隐藏(Java field hiding)

2019-06-23 14:48发布

In the following scenario:

class Person{
    public int ID;  
}

class Student extends Person{
    public int ID;
}

Student "hides ID field of person.

if we wanted to represent the following in the memory:

Student john = new Student();

would john object have two SEPARATE memory locations for storint Person.ID and its own?

Answer 1:

正确。 在你的榜样每个类都有自己的int ID id字段。

您可以阅读或在子类这样分配值:

super.ID = ... ; // when it is the direct sub class
((Person) this).ID = ... ; // when the class hierarchy is not one level only

或外部(当它们是公共的):

Student s = new Student();
s.ID = ... ; // to access the ID of Student
((Person) s).ID = ... ; to access the ID of Person


Answer 2:

是的,你可以验证:

class Student extends Person{
    public int ID;

    void foo() {
        super.ID = 1;
        ID = 2;
        System.out.println(super.ID);
        System.out.println(ID);
    }
}


Answer 3:

对,那是正确的。 将有两个不同的整数。

您可以访问Person的int类型Student有:

super.ID;

不过要小心,动态调度不发生对成员字段。 如果你定义一个使用上的人的方法ID字段,它是指Person的领域,而不是Student “,即使被称为S上一个Student对象。

public class A
{
    public int ID = 42;

    public void inheritedMethod()
    {
        System.out.println(ID);
    }
}

public class B extends A
{
    public int ID;

    public static void main(String[] args)
    {
        B b = new B();
        b.ID = 1;
        b.inheritedMethod();
    }
}

上述将打印42,而不是1。



文章来源: Java field hiding