2013-04-28 44 views
-2

我仍然是Java中的新手。我的問題可能是非常基本的。定義爲Private的變量

我有一個類的超類箱,

package chapter8; 

public class Box { 

    double width; 
    private double height; 
    private double depth; 

    Box(double w, double h, double d) { 
     width = w; 
     height = h; 
     depth = d; 
    } 

    double volume() { 
     return width * height * depth; 
    } 
} 

BoxWeight是框超類的子類:

package chapter8; 

public class BoxWeight extends Box { 

    double weight; 

    BoxWeight(double w, double h, double d, double m){ 
     super(w, h, d); 
     weight = m; 
    } 
} 

現在我有主在DemoBoxWeight

package chapter8; 

public class DemoBoxWeight { 

    public static void main(String[] args) { 

     BoxWeight myBox1 = new BoxWeight(2, 3, 4, 5); 

     System.out.println("Volume1 :" + myBox1.volume()); 
     System.out.println("Weight1 :" + myBox1.weight); 
     System.out.println("Widht1: " + myBox1.width); 
     System.out.println("Depth1: " + myBox1.depth); // as depth is private, it is not accessible 
    } 
} 

高度和深度被定義爲Private,所以實際傳遞這些變量的值的DemoBoxWeight不是abl e訪問它。我知道我可以將Private改爲default/public,但是還有另一種方式,以便傳遞值的類實際上可以訪問它?

PS:由於我是新的我的術語可能是錯誤的,我的問題很愚蠢

+1

基本上,你會想要使用getters和setter;公共方法來獲取或修改您的私有變量。 – 2013-04-28 17:34:11

+0

http://stackoverflow.com/questions/2036970/tutorial-on-getters-and-setters – 2013-04-28 17:34:18

+0

你需要回答的第一個問題是,如果DemoBoxWeight能夠訪問高度和重量,或者是那些太接近實現細節應該隱藏其他類嗎?如果它們應該可用,那麼'public int getHeight()'會使高度可讀。 – 2013-04-28 17:36:57

回答

5

這樣做的通常的方法是寫getter和setter方法是這樣的:

public double getHeight() 
{ 
    return this.height; 
} 

public void setHeight(double height) 
{ 
    this.height = height; 
} 

您可以刪除如果你不希望課堂以外的價值改變,你可以使用setter。

+0

我同意,但如果編輯代碼並初始化私有變量的高度和深度,說= 1,然後在我創建BoxWeight對象時,在類DemoBoxWeight中,我可以覆蓋已經初始化爲1的值的高度和深度,無論我是什麼通過說3,4,儘管他們受到保護,他們得到設置沒有getter/setter – prabh 2013-04-28 17:51:17

+0

@prabh我不知道我明白這個問題。在'DemoBoxWeight'中,你用你提供的構造函數初始化一個'BoxWeight'實例。創建對象'DemoBoxWeight'後,不能再更改這些值。如果您不想在構建對象時更改初始值,請不要提供啓用該對象的構造函數。 – MAV 2013-04-28 17:56:59

1

基本上,您需要爲您的類屬性提供訪問方法。

有2種訪問方法 - getterssetters,這些都是根據Java Bean definition

+0

我同意,但如果編輯代碼並初始化私有變量的高度和深度,說= 1,然後在我創建BoxWeight對象時,在類DemoBoxWeight中,我可以覆蓋已經初始化爲1的值的高度和深度,無論我是什麼通過說3,4,儘管他們受保護,他們得到設置沒有getter/setter – prabh 2013-04-28 17:58:13

0

這主要是通過創建所謂的getters完成的。

public int getHeight(){ 
    return this.height; 
} 

的想法是,(而不是把事情公開),每當在未來你想改變你的箱子的內部表示,你可以做到這一點,而不依賴於高度打擾用戶。

例如:

比方說,你想存儲對角線,而不是深度。或者你可能想使用浮點數或其他數字類型。

getHeight可能會開始尋找,因爲這:

public int getHeight(){ 
    return diagonalstoHeight(diagonal1, height, width); 
} 

而且沒有人會了。您還應該閱讀約encapsulationinformation hiding

+0

我同意,但如果編輯代碼並初始化私有變量的高度和深度,說= 1,然後在類DemoBoxWeight時,我創建BoxWeight對象,我可以覆蓋已經初始化爲1的值的高度和深度,無論我傳遞的是3,4,儘管它們受到保護,但它們沒有getter/setter – prabh 2013-04-28 17:59:45

0

將私人更改爲受保護。

受保護的修飾符允許類層次結構中的所有子類訪問實例變量,而無需使用getter或setter方法。

它仍然拒絕訪問它的其他類(在類層次結構之外),所以封裝仍然佔據。