2015-08-16 64 views
-1

鑑於下一類:多態性在Java類

public class AA {  
    public int _x; 

    public AA() {  
     this(1);  
    } 

    public AA(int k) {  
     _x = k*10;  
    } 

    public int getX() {  
     return _x ;  
    }  
} 

public class BB extends AA {  
    public int _x; 

    public BB() {  
     this(2);  
    } 

    public BB(int k) {  
     super(k+1); 
     _x = super.getX() + 1; 
    }  

    public int getX() {  
     return _x;  
    }  
} 

如果我進行下一步操作:

a =new BB(); 

我想我應該得到的31 _x值,但是這不是我我正在得到。在我對多態性的理解中,_x值應該來自AA類,是不是這種情況?

+1

如何'了'聲明?你用什麼來檢驗'_x'的價值? – RealSkeptic

+2

'BB'中'_x'的值爲'31','AA'爲'30'。這不是你所得到的嗎? – Codebender

+1

_...但這不是我所得到的._你爲什麼認爲不提供你真正想要的東西會讓你的問題比告訴我們更清楚? –

回答

2

字段不覆蓋,只隱藏。假設你正在做:

AA a = new BB();

如果您訪問a._x,將得到30,因爲您將訪問範圍在AA類的字段。

但是,如果你要調用a.getX(),你會調用重寫的方法,因此得到31(你將通過get方法獲得在BB類中的字段範圍)。

你同樣會得到31,如果你這樣做:

BB B =新BB();

並訪問b._x;

1

多態性僅適用於非靜態非私有方法。變量在編譯時解析,所以a._x將引用AA中聲明的變量,無論實際對象是什麼。

+0

BB的建造者正在接受BB或AA的變量嗎?如果我在BB中調用getX()函數,它是否返回AA或BB中_x的值? –

+0

BB的大括號內的任何'_x'都是BB的'_x'。 'getX'方法返回AA的'_x'。 – Joni

2

我想你已經寫

AA a = new BB(); 

自變量是在編譯時,你會得到_x是一個在AA級解決。所以你打印30張。假設,當然,你這樣做:

System.out.println(a._x); 

下應該給你31:

System.out.println(a.getX()); 
    System.out.println(((BB)a)._x); 
2

至於說通過@drrob,字段只隱藏,沒有覆蓋。由於多態是行爲概念。 即使它宣佈一個如何也是有區別的。要明確, 我已經添加了一些代碼,從main調用。

請看下面場景

AA a = new BB(); 
System.out.println(" finally1 = "+a._x); 
System.out.println(" finally2 = "+a.getX ()); 
BB a1 = new BB(); 
System.out.println(" finally3 = "+a1._x); 
System.out.println(" finally4 = "+a1.getX()); 

這裏輸出的輸出應爲如下:

finally1 = 30

finally2 = 31

finally3 = 31

finally4 = 31