2013-04-29 243 views
0

我跑到下面的代碼:私有變量初始化

public class Box { 

    private int length = 1; 
    private int width = 2; 
    private int height = 3; 

    Box(int l, int w, int h) { 
      length = l; 
      width = w; 
      height = h; 
     } 

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

} 

public class DemoBox { 

    public static void main(String[] args) { 

     Box box1 = new Box(3, 3, 3); 
     System.out.println("Volumne: " +box1.volume()); 
    } 
} 

我一直以爲我將無法修改私有變量的值,而無需的getter/setter。但在上面的代碼中,我能夠將值傳遞給私有變量,結果體積爲27(3 * 3 * 3)。這是預期的行爲,並請解釋我失去了我在私人變數和getter/setter

+1

回去再讀一下私人變量。你可以在他們聲明的類中訪問它們。 'volume()'是'Box'的一個實例方法,因此可以訪問它們。 – 2013-04-29 19:19:12

+0

您只能像這樣分配私有變量。獲取者/設置者通常由於訪問其他類而被定義爲public。 – 2013-04-29 19:21:27

回答

1

的理解你沒有直接傳遞它們。你在構造函數中傳遞了它們,這是預期的行爲。請注意,這些值在構造函數的代碼中進行了更改,該構造函數包含在聲明這些專用字段的類中。

嘗試在DemoBox類中執行box1.length = 10並查看編譯器所說的內容。

0

類別Box範圍內的任何代碼都可以修改和/或讀取Box類範圍內聲明爲private的變量。事實上,這就是吸氣人員和安裝人員的工作方式;他們處於該類的範圍內並且訪問變量private

當你說在DemoBoxBox box1 = new Box(3, 3, 3);DemoBox代碼沒有修改的變量中,Box構造一樣,而Box構造函數是類的範圍之內,因此它可以訪問private變量。

DemoBox中的代碼不能直接修改Box中的私有變量; Box中的任何public方法將允許DemoBox通過在Box類的範圍內的方法代碼間接修改它們。

1

一切都很好,你可以設置這個值這種方式(由構造)只有一次 - 構建對象。在此之後,變量是安全的,沒有人可以改變值。

Box不是對象,這是類定義!

public class Box { 
... 
} 

box1爲對象,施工後沒有辦法去改變它(沒有魔法):)

Box box1 = new Box(3, 3, 3); 

如果你想方法value()的結果是8,那麼你必須定義另一個對象:

Box box2 = new Box(2, 2, 2); 

此後box2.value() == 8

沒有辦法使box1.value() == 8(沒有一些魔術)。

但是你可以爲最終宣告字段保護申報值

private final int length = 1; 
private final int width = 2; 
private final int height = 3; 

在這之後,你不能改變自己的價值觀,即使在構造 - 發生編譯失敗。

Getter賦予其他人創建時間後讀取值的權限。 設置者賦予其他人創建時間後修改值的權限。沒有這個你的領域是安全的。

1

私有變量可以由類內部修改,如果它們不是最終的。在你的情況下,你的類的構造函數正在覆蓋你的默認值。這是有效和普遍的。

0

是的,這是預期的行爲。您正在修改這些變量,但是在它們所屬的類的內部,按照它在類中描述的方式。你不能做的是獲得像box1.length這樣的變量或者設置其值如box1.length = 5。就像Box是唯一一個可以最終決定是否可以獲得變量值或設置變量值的方法。你可以從外部設置長度值,因爲Box「想要它」,因爲你在Box構造函數中允許它(或者在另一種方法中,它將是相同的情況)。

0

當你實例化你的成員變量,如

private int length = 1; 
private int width = 2; 
private int height = 3; 

你只是提供可以通過構造函數傳遞不同的值來覆蓋默認值。

Box box1 = new Box(3, 3, 3); 

但是,那麼這是有道理的,你還需要提供一個默認構造函數。

Box() {} 

沒有默認構造有一個在你的成員變量提供默認值,因爲他們總是會被你的參數的構造函數覆蓋是沒有意義的。

Box defaultBox = new Box(); 
System.out.println("Volumne: " + box1.volume()); // prints 6; default volume 

現在,您可以修改私有變量的原因是您在構造函數中這樣做了;一個特殊的類構造,用於初始化正在構建的對象的狀態。私人訪問修飾符在這裏不適用,因爲您要保護私人需要首先構建!

0

私有變量可以在它們被定義的類中修改。除了定義變量的類以外,我們不能在沒有setter的情況下修改私有變量。