3

在以下场景中:

class Person{
    public int ID;  
}

class Student extends Person{
    public int ID;
}

学生“隐藏人的ID字段。

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

Student john = new Student();

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

4

3 回答 3

5

正确的。您示例中的每个类都有自己的int IDid 字段。

您可以通过这种方式从子类中读取或分配值:

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
于 2012-04-14T14:46:54.643 回答
5

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

class Student extends Person{
    public int ID;

    void foo() {
        super.ID = 1;
        ID = 2;
        System.out.println(super.ID);
        System.out.println(ID);
    }
}
于 2012-04-14T14:36:17.743 回答
1

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

您可以通过以下方式访问Person's int Student

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。

于 2012-04-14T14:33:56.033 回答