2014-06-25 105 views
-1

我有三個類如下,類b和c擴展類a。我想知道爲什麼代碼沒有讀取b和c變量的值。我的主要方法爲什麼子類不會覆蓋其超類變量的值?

public class a{ 
    protected int myvalue = 1; 

} 

public class b extends a{ 
    private int myvalue = 2; 
} 

public class c extends a{ 
    private int myvalue = 3; 
} 

ArrayList<a> myList= new ArrayList(); 
    myList.add(new b()); 
    myList.add(new c()); 

    for(int i =0;i<myList.size();i++) 
     System.err.println("value is:" + myList.get(i).myvalue); 

輸出

1 
1 

From Oracle website:

在一個類中,與超類中的字段具有相同名稱的字段隱藏超類的字段,即使它們的類型與 不同。在子類中,超類中的字段不能是其簡單名稱引用的 。相反,該字段必須通過super訪問 ,這將在下一節中介紹。一般來說 說,我們不建議隱藏字段,因爲它使代碼難以讀取 。

+2

-1用於不可編譯的代碼。 'myList中(我)'?來吧,不要對我們這樣做,如果你不希望我們成功,也不要馬虎。 –

+0

這是一個錯字的人很容易 – Jack

+2

但它不會編譯。就像您在for循環中訪問私有變量一樣。 – BitNinja

回答

3

你遮蔽你的領域myvalue,而不是覆蓋它,我相信這樣的事情會做你想要

public class a{ 
    protected int myvalue = 1; 
} 

public class b extends a{ 
    public b() { 
    myvalue = 2; 
    } 
} 

public class c extends a{ 
    public c() { 
    myvalue = 3; 
    } 
} 

什麼還有,請不要使用Raw Types

// ArrayList<a> mylist = new ArrayList(); 
ArrayList<a> mylist = new ArrayList<>(); // <a> on Java 5 and 6 
+0

非常感謝,你對我從Oracle網站分享的內容有什麼想法? – Jack

+0

@JackMoore仔細看看教程中的內容:「**在子類**中,超類中的字段不能以其簡單名稱引用。」 (重點是我的)。當你做外部參考時,這些字段不是多態的。 – azurefrog

+0

@azurefrog它讓我感到困惑,因爲它說「在一個類中,與超類中的字段具有相同名稱的字段隱藏了超類的字段,即使它們的類型不同。」然後它說:「在子類中,超類中的字段不能被其簡單名稱引用」 – Jack

相關問題