Java字段隐藏

时间:2012-04-14 14:28:21

标签: java field member-hiding

在以下情形中:

class Person{
    public int ID;  
}

class Student extends Person{
    public int ID;
}

学生“隐藏了人的身份证。

如果我们想在内存中表示以下内容:

Student john = new Student();

john对象是否有storint Person.ID和它自己的两个SEPARATE内存位置?

3 个答案:

答案 0 :(得分:5)

是的,您可以通过以下方式验证:

class Student extends Person{
    public int ID;

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

答案 1 :(得分:5)

正确。示例中的每个类都有自己的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

答案 2 :(得分:1)

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

您可以使用以下网址访问Person中的Student int

super.ID;

但要小心,成员字段不会发生动态调度。如果您在Person上使用ID字段定义方法,即使在Person对象上调用,它也会引用Student的字段,而不是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。