2012-02-23 55 views
33

我有3類:如果覆蓋類的子類中的字段,那麼子類有兩個具有相同名稱(和不同類型)的字段?

public class Alpha { 
    public Number number; 
} 

public class Beta extends Alpha { 
    public String number; 
} 

public class Gama extends Beta { 
    public int number; 
} 

爲什麼下面的代碼編譯?而且,爲什麼測試通過時沒有任何運行時錯誤?

@Test 
public void test() { 
    final Beta a = new Gama(); 
    a.number = "its a string"; 
    ((Alpha) a).number = 13; 
    ((Gama) a).number = 42; 

    assertEquals("its a string", a.number); 
    assertEquals(13, ((Alpha) a).number); 
    assertEquals(42, ((Gama) a).number); 
} 
+2

而且?它的作品如此。如果你需要重寫,你應該使用setter/getter方法。公共領域幾乎總是一個壞主意。 – kan 2012-02-23 14:33:05

回答

45

成員變量不能像方法一樣被覆蓋。您的類BetaGama中的number變量是隱藏(而不是覆蓋)超類的成員變量number

通過強制轉換,您可以訪問超類中隱藏的成員。

36

字段不能被重寫;他們不是首先進行多態訪問 - 你只是在每種情況下聲明一個新字段。

它編譯,因爲在每種情況下,表達式的編譯時間類型足以確定其中字段名爲number您的意思是。

  • 常識性:遮蔽領域,使你的代碼難以閱讀,所以乾脆不要做它
  • 能見度:

    在真實世界編程,你會通過兩種方式避免這種情況,如果你使所有的領域都是私人的,子類無論如何都不知道它們

相關問題