2012-01-15 52 views
1

我有一個變量爲bool var = true的類A和一個獲取方法getVar()。 我試圖創建一個擴展A的類B,並將var重新定義爲bool var = false。代碼:Java中的變量繼承(初級)

public class A{ 
    protected boolean var = true; 
    public boolean getVar(){ 
     return var; 
    } 
} 

public class B extends A{ 
    protected boolean var = false; 
} 

的問題是,如果我執行:

B b_class = new B(); 
System.out.println(b_class.getVar()); 

我獲得true,我不爲什麼已瞭解。我做錯了什麼?

+0

你不能'B.getVar()',因爲該方法不是靜態的。我假設你的意思是'b_class.getVar()'並修復它。 – kba 2012-01-15 18:47:08

+0

絕對!謝謝。 – Manuel 2012-01-15 18:53:15

回答

2

你不應該建立在你重寫類的新實例變量,因爲它不能由超類(A)中可以看出,因此,當getVar()被調用時,它會返回它可以看到的值。您應該在構造函數中將var的值設置爲您想要的值。

public B() { 
    var = false; 
} 
+0

這就是我想要的解釋,非常感謝! – Manuel 2012-01-15 18:50:44

7

你不「繼承」變量; B.var只隱藏A.var,但只在B。您正在撥打getVar()A中的方法,其中A.var,即true

3

您在B中聲明瞭一個新的var字段,它隱藏了A.var。試試這個:

public class B extends A { 
    public B() { 
     var = false; 
    } 
} 
+0

作品很有魅力,謝謝! – Manuel 2012-01-15 18:50:21

0

GetVar未在B中定義,因此多態性跳轉到A,其中var爲true。

1

在超類中初始化的變量不能像這樣改變。你已經聲明瞭protected boolean var = true。所以,無論你在擴展課上做什麼,它總會向你展示你的真實。