2013-09-28 34 views
1

我想了解Java中的面向對象編程,我有這個問題。如何使用父類中的字段實例化對象?

比方說,我有AA父類是這樣的:

public class Shape { 
    private int location; 
    private Color color; 
    // methods such as getLocation() and getColor() 

    public Shape(int initialLocation, Color initialColor) { 
     location = initialLocation; 
     color = initialColor; 
    } 


} 

如何讓我的孩子上課,這樣我可以構建,也就是說,一個長方形的起始位置,並在初始顏色主要方法?我是否在Rectangle類中創建構造函數?我不能因爲位置和顏色是私人領域。我是否創建位置和顏色的存取方法,並在實例化後設置位置和顏色?我想,但有沒有辦法做到這一點,沒有訪問者?

public class Rectangle extends Shape { 
    public Rectangle(int initialLocation, Color initialColor) { 
     super(initialLocation, initialColor); 
    } 

} 

我只是不能籠罩這個基本概念。任何幫助?

+1

您可以重複使用您的父類的構造函數與「超(...)'調用。或使用setter。 –

+0

爲什麼地球上會有'矩形'延伸'車輛'? –

+0

@RohitJain車?哪裏? – Dukeling

回答

4

重用構造

public class Shape { 
    private int location; 
    private Color color; 

    public Shape(int location, Color color) { 
     this.location = location; 
     this.color = color; 
    } 
    // methods such as getLocation() and getColor() 
} 

public class Rectangle extends Shape { 
    public Rectangle(int location, Color color /*, more */) { 
     super(location, color); 
     // more 
    } 
} 

official tutorial解釋了它的使用。

+0

我根據你的建議編輯了我的代碼。謝謝! –

+1

@Giga你還有問題嗎? –

+0

是的,如果我有更長的繼承層次結構。例如,Shape - > MovingShape - > Rectangle。我必須以同樣的方式爲MovingShape類創建構造函數。正確? –

1

如果您想擴展變量,您可以將其修飾符更改爲protected,因此它可以被繼承,否則private就像它們不存在的子類。

1

但是,您可以將實例變量定義爲protected,但這違背了面向對象的封裝原則。我會爲類Shape的每個實例變量使用getter和setter。此外,如果在Shape中創建構造函數,則可以調用Rectangle中的超級構造函數來設置Rectangle中的位置和顏色。

public class Rectangle extends Shape { 
    public Rectangle(int location, Color color) { 
     super(location, color); 
    } 
} 

只要你在外形下面的構造:

public class Shape { 
    // location and color define. 

    public Shape(int location, Color color) { 
     this.location = location; 
     this.color = color; 
    } 
    // getters and setters which are public for location and color 
} 
0

在基類私有成員只能由子類訪問是毫無意義的! 如果你想閱讀它們,你至少需要一個公共的或受保護的吸氣劑。 如果你想寫他們,你至少需要一個公共或受保護的setter和/或一個構造函數來初始化它們。

相關問題