在以下情形:Java字段隱藏
class Person{
public int ID;
}
class Student extends Person{
public int ID;
}
學生「隱藏的人ID字段
如果我們想代表在內存中的以下內容:
Student john = new Student();
將約翰對象有兩個獨立的存儲位置,用於storint Person.ID和它自己的?
在以下情形:Java字段隱藏
class Person{
public int ID;
}
class Student extends Person{
public int ID;
}
學生「隱藏的人ID字段
如果我們想代表在內存中的以下內容:
Student john = new Student();
將約翰對象有兩個獨立的存儲位置,用於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
是的,這是正確的。將有兩個不同的整數。
您可以訪問Person
的int類型Student
有:
super.ID;
不過要小心,動態調度不發生對成員字段。如果您在使用ID
字段的Person上定義方法,則即使在Student
對象上調用該字段,它也會引用Person
的字段,而不是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
是的,你可以驗證:
class Student extends Person{
public int ID;
void foo() {
super.ID = 1;
ID = 2;
System.out.println(super.ID);
System.out.println(ID);
}
}
這對應於我的評論如下:這意味着人,在內存中佔用8個字節的空間,並有兩個存儲位置持有兩個ID對? – Bober02
是的,你有兩個ID – dash1e