2013-12-16 64 views
5

我在21天內使用Sams Teach Yourself Java學習Java(順便提一句,這比我花了21天多)。在第五章中,最後的練習要求我創建一個Point類的子類FourDPoint。我做了這個,但有一個有趣的結果。我第一次做的運動,這是我的代碼:使用超級和實例變量的構造函數

import java.awt.Point; 

class FourDPoint extends Point { 
    int x; 
    int y; 
    int z; 
    int t; 

    FourDPoint(int x, int y, int z, int t){ 
     super(x, y); 
     this.z = z; 
     this.t = t; 
    } 

    public static void main(String[] arguments){ 
     FourDPoint fp = new FourDPoint(5, 5, 10, 10); 
     System.out.println("x is " + fp.x); 
     System.out.println("y is " + fp.y); 
     System.out.println("z is " + fp.z); 
     System.out.println("t is " + fp.t); 
    } 
} 

結果:x爲0,y爲0,z爲10,y爲10

我通過消除intitilized改變了我的代碼x和y,這給了我正確的答案。我的問題:爲什麼我得到x是0而y是0? intitiaized x和y優先於super(x,y)嗎?

回答

5

在你的子類中,你用你自己的方法來影射Points x和y變量。要解決這個問題,你可以使用super.xsuper.y

當你在構造函數中調用super()時,Point設置它的x和y字段。你自己創建了一個x和y,默認值爲0.所以當你引用fp.x和fp.y時,你總會得到你的(它總是爲0)

7

This is what we call hiding.假設你的類Point也聲明瞭兩個實例命名xy變量,這些都是你與

super(x, y); 

但是設置的,當你引用

System.out.println("x is " + fp.x); 
System.out.println("y is " + fp.y); 

你指的是成員聲明。那些尚未初始化,因此它們默認爲0.

在相關說明中,多態性不適用於實例變量。相反,會員根據您訪問的參考類型進行解析。

所以

FourDPoint fp = ...; 
fp.x; 

fp.x將涉及到在FourDPoint宣佈x成員。但

FourDPoint fp = ...; 
fp.x; 
((Point) fp).x; 

((Point) fp).x;將涉及到在Point宣佈x成員。

5

你的類FourDPoint包含本地成員,影着超級控xy,註釋掉這兩條線 -

// int x; 
// int y; 
3

你從未設置的xy的東西的價值,所以他們總是返回0 。

是的,你調用超級構造,但是這並不重要:即使存在變數xPointy,它們被命名爲SAM變量隱藏e在FourDPoint

更不用說Point中的變量也應該是protected

0

工作流是這樣的:父對象的成員被初始化,父對象的構造函數被調用,你的類成員被初始化(原語被設置爲0)你的類構造函數的代碼被執行。

0

是的,他們優先考慮,因爲你重寫了它們。就那麼簡單。