2009-12-16 58 views
3

nullObject類型?什麼是初始化的java對象字段?

 
class C { 
    int i; 
    String s; 
    public C() {} 
} 

s始終爲空?

簡單類型如int?那會是什麼?零或任意值?

那麼方法中的局部變量呢?

 
public void meth() { 
    int i; 
} 

什麼是i的單位化值?


<依靠這種默認值,但是,通常被認爲是不好的編程風格>

好吧,你有什麼建議,我們怎麼辦?

class A { 
    String s=""; 
    int i=0; 
} 

OR

class A { 
    String s; 
    int i; 
    public A() { 
     // default constr 
     s=""; 
     i=0; 
    } 
} 

哪個更好,爲什麼?

+0

你爲什麼不通過調試器運行它並找出? – Pat 2009-12-16 09:44:28

+0

答案在我的評論中。 – EugeneP 2009-12-16 09:54:40

回答

19

中太陽java tutorial

它並不總是必要的,當某個字段聲明指定一個 值。已聲明但未初始化的字段 將由編譯器設置爲 的合理默認值。一般來說,這個 默認值將爲零或爲空, 取決於數據類型。依靠 這樣的默認值,然而, 一般認爲編程不好 風格。

以下圖表總結了上述數據 類型的 默認值。

Data Type Default Value (for fields) 
byte     0 
short     0 
int      0 
long     0L 
float     0.0f 
double     0.0d 
char     '\u0000' 
boolean     false 
String (or any object) null 

局部變量略有不同 ;編譯器從未將 默認值分配給未初始化的局部變量 。如果您不能 初始化您的本地變量,其中 它被聲明,請確保在嘗試使用它之前爲其分配一個值 。 訪問未初始化的本地變量 將導致編譯時 錯誤。

4

對於成員變量: String的默認值爲null。基元的默認值爲0(或浮點值爲0.0)。

對於局部變量: 您必須在使用它之前顯式初始化局部變量。

至於你的問題的第二部分: 你總是可以在成員變量定義中說String s = "";,或者在構造函數中說s = "";。然後你知道它將有一個非空值。 (另外,在您的setter中,您需要確保某人不會嘗試將其重置爲空。)

+0

或布爾值爲false。 – Thilo 2009-12-16 08:37:29

+0

或對象爲空 – Ash 2009-12-16 08:38:43

+0

<<另外,在你的二傳手中,你需要確保有人不會試圖將其設置回null >> 噸和愚蠢的工作噸。當然,我可以做到這一點。但那不是我期望的編程風格。假設你必須爲1000個字段這樣做。 – EugeneP 2009-12-16 08:54:22

3

Fields: Object default to null;整數,多頭和空頭至0;字符串爲null;布爾人爲假。這全是here

編譯器會強制你自己初始化方法中聲明的變量,局部變量

2

原始字段初始化爲0/false。對象被初始化爲null。但坦率地說,你可以試過那個..

+3

..雖然嘗試只有在您確定的情況下才有意義,但現場初始化已定義且可靠。當然,我們知道,它是,並且編譯器不會讓你去那裏(局部變量)。但是,如果您不確定並且不知道該在哪裏尋找,那麼它既是一個問題也是一個很好的答案(順便說一句,+1)。 – 2009-12-16 08:46:29

+2

- >坦率地說,你可以試過那個。 它可能是一個不可重複的測試。你可以得到0千次。然後,隨着內存刷新,獲得40億美元。 – EugeneP 2009-12-16 08:50:44

1

至於setter-method的問題:setter的全部重點是他們可以檢查傳遞的對象是否符合類的要求。例如

public void setS(String s) { 
    if (s == null) 
    throw new IllegalArgumentException("S must not be null"); 
    this.s = s; 
} 

或者與谷歌集合/谷歌番石榴:

public void setS(String s) { 
    this.s = Preconditions.checkNotNull(s, "S must not be null"); 
} 

當然,你可以定義任意的限制,如:

/** 
* Sets the foo. Legal foo strings must have a length of exactly 3 characters. 
*/ 
public void setFoo(String foo) { 
    if (foo == null) 
    throw new IllegalArgumentException("Foo must not be null"); 
    if (foo.length() != 3) 
    throw new IllegalArgumentException("Foo must have exactly 3 characters"); 
    ... 

當然你應該這樣的情況下,總是在設置者和/或類的JavaDoc中聲明屬性的正確值範圍。

+0

好吧,preconditions.checknotnull看起來很漂亮! 爲什麼它不在標準的java庫中?這就是我對Java的期望。 – EugeneP 2009-12-16 09:02:49