2013-02-06 68 views
1

爲什麼我們不能覆蓋Java中的變量,它隱藏變量我們爲什麼不能覆蓋Java中的變量

class A { 
    int a = 4; 
    public void test(){ 
     System.out.println("Test method of A"); 
    } 
} 

class B extends A { 
    int a = 5; 
    public void test(){ 
     System.out.println("Test method of B"); 
    } 
    public static void main(String s[]){ 
     A a= new B(); 
     System.out.println("Value of a : " a.a); 
     System.out.println("Method result " a.test()); 
    } 
} 

輸出::

Value of a : 4 
Mthod result :Test method of B 

由於B的類測試方法被叫,但變量訪問從超級參考

+3

'class B extends B' ...什麼? – Makoto

+0

對不起其延伸的 – varsha

+0

已經解釋[這裏] [1]和[這裏] [2] 問候 [1]:http://stackoverflow.com/questions/427756/overriding-a-超級實例變量 [2]:http://stackoverflow.com/questions/8983002/how-are-the-variables-overridden-in-java – ultraklon

回答

4

這只是如何Java的工作原理。當代碼有一個B但只有'知道'它有一個A時,B的方法將被調用,但A的變量將被訪問(因爲變量沒有'方法重載等價')。我建議你在getter和setter中包裝變量而不是暴露,所以你可以通過重寫getter和setter來控制它們在子類中的行爲。

+0

是的。我想知道java在這種情況下的行爲 – varsha

0

如果您要訪問父類的變量,然後使用
System.out.println(((A)a).a);
類型轉換對象到其父,然後訪問它

+0

我想你誤解了這個問題。我建議再讀一遍。 –

0

假設你有一個不接受A型

的參數的方法
void f(A a) { 
    // do something with a.a 
} 

f方法的作者已經編寫了此方法,期望由A類定義的行爲。並且您想要更改此行爲。當你重寫一個方法時,你可能會也可能不會改變這個行爲,而你不應該這樣做。你可以添加一些其他功能,但不會改變預期的行爲,如果你可以覆蓋一個變量,你肯定會改變行爲。檢查Open/ClosedLiskov SubstitutionPrinciples of Object Oriented Design

相關問題