2012-04-14 210 views
3

在以下情形:Java字段隱藏

class Person{ 
    public int ID; 
} 

class Student extends Person{ 
    public int ID; 
} 

學生「隱藏的人ID字段

如果我們想代表在內存中的以下內容:

Student john = new Student(); 

將約翰對象有兩個獨立的存儲位置,用於storint Person.ID和它自己的?

回答

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 
+0

這對應於我的評論如下:這意味着人,在內存中佔用8個字節的空間,並有兩個存儲位置持有兩個ID對? – Bober02

+0

是的,你有兩個ID – dash1e

1

是的,這是正確的。將有兩個不同的整數。

您可以訪問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

+0

只是可以肯定,內存將有某事像: 120:10 - > Person.ID 124:99 - > this.ID 但新的學生()將只 120:10 – Bober02

+0

我不明白你的評論。學生有自己的ID,加上第二個不同的int,具有從Person繼承的相同名稱。這兩個整數不共享相同的內存位置,並且可以獨立訪問。 (你是否真的應該使用這個「特性」是有爭議的,這可能是非常混亂的,尤其是虛擬方法。) – Mat

+0

好的,我想問的是新實例化的學生對象是否佔用8個字節的內存爲兩個ID分開存儲位置)和學生只需要4個字節的內存? – Bober02

5

是的,你可以驗證:

class Student extends Person{ 
    public int ID; 

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