在以下场景中:
class Person{
public int ID;
}
class Student extends Person{
public int ID;
}
学生“隐藏人的ID字段。
如果我们想在内存中表示以下内容:
Student john = new Student();
john 对象是否有两个单独的内存位置用于 storint Person.ID 和它自己的?
在以下场景中:
class Person{
public int ID;
}
class Student extends Person{
public int ID;
}
学生“隐藏人的ID字段。
如果我们想在内存中表示以下内容:
Student john = new Student();
john 对象是否有两个单独的内存位置用于 storint Person.ID 和它自己的?
正确的。您示例中的每个类都有自己的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
是的,您可以通过以下方式验证:
class Student extends Person{
public int ID;
void foo() {
super.ID = 1;
ID = 2;
System.out.println(super.ID);
System.out.println(ID);
}
}
对,那是正确的。将有两个不同的整数。
您可以通过以下方式访问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。