2013-07-03 130 views
0
public class RectangleEx extends Rectangle 
{ 
    int height =0; 
    int width=0; 

    public RectangleEx(int height, int width) 
    { 
     super(height,width); 
    } 

    public RectangleEx() 
    { 
     super(0,0); 
     this.setHeight(5); 
     System.out.println(this.height); 
    } 
} 

誰能告訴我爲什麼,當使用第二個構造函數創建新的RectangleEx時,其高度爲0而不是5?這是超類中setHeight的代碼:子類設置方法不起作用

public void setHeight(int height) 
{ 
    this.height = height; 
} 
+0

來自超類的'height'與您繼承的類的'height'不一樣。 –

回答

1

這是由於實例變量隱藏。由於您已經在子類中聲明瞭另一個具有相同名稱的變量height,它隱藏了在超類中定義的變量。所以,當你訪問變量時,使用this.height,這會給你在子類中定義的值height,它根本沒有設置。

呼叫:

this.setHeight(5); 

調用超類,它設置在超級類本身高度的方法中,而

System.out.println(this.height); 

正在訪問在RectangleEx限定,而不是Rectangleheight,這是仍然是0.

如果你想訪問超類的height,defi ne a getter in super class,它將返回超類變量。

+0

只要不是'private' – DannyMo

+0

@damo,'super.height'也會工作。我不認爲這是可行的。在私有變量的情況下,甚至不考慮成員隱藏,因爲它們在課堂以外甚至不可見。隱藏適用於公共,受保護或包私有變量。 –

+0

等等...當我這樣做.setHeight(5)時,我將SUPERCLASS的高度設置爲5?但我甚至沒有定義屬於超類的對象!我很困惑。我認爲子類的對象繼承了set方法,而子類對象可以用this.method引用自己... –