2012-05-02 39 views
1

我有2類:屬性和多態性

public class Increase { 
public int a=3; 
public void add(){ 
    a+=5; 
    System.out.println("f"); 
} 
} 

class SubIncrease extends Increase{ 
    public int a=8; 
    public void add(){ 
     a+=5; 
     System.out.println("b" + a); 

    } 
} 

但是當我運行

Increase f=new SubIncrease(); 
    System.out.println(f.a); 
    f.add(); 
    System.out.println(f.a); 

我得到這樣的輸出:

3 
b13 
3 

誰能幫助我理解爲什麼會這樣? a方法的值在方法add中發生了變化,如第二個outpuy行所示...爲什麼它恢復到原始值?

回答

5

在Java中,字段不會被覆蓋,它們是隱藏的。這意味着Increase.aSubIncrease.a單獨的字段可以單獨更改和查詢。由於變量f的類型爲Increase,因此表達式f.a將返回超類字段的值。但add()方法覆蓋和f.add()調用子類方法,它修改子類字段。

隱藏領域很少有意義,所以你應該避免它。如果你想在一個子類中有一個具有不同默認值的字段,那麼只需在超類中定義它,並在子類構造函數中爲其賦值。