如果在構造器中沒有顯式地給域賦予初值,那么就會被自動賦為默認值:數值為0,布爾值為false,對象引用為null.
這是域與局部變量的主要不同點.必須明確地初始化方法中的局部變量.但是,如果沒有初始化類中的域,將會被自動初始化為默認值.
class Employee{ private String name; private double salary; }
例如,假定Employee類沒有在構造器中進行初始化,就會默認地將salary域初始化為0,將name域初始化為null.
但是,這並不是一種良好的編程習慣.如果此時調用getName方法,則會得到一個null引用,這不是我們所希望看到的結果.
很多類都包含一個無參數的構造函數,對象由無參數構造函數創建時,狀態會設置為適當的默認值.例如,下面是Employee類的無參數構造函數
public Employee(){ name = ""; salary = 0; }
如果在編寫一個類時沒有編寫默認的構造器,那么系統就會提供一個默認無參數構造器.這個構造器將所有實例域設置為默認值.於是,實例域中的數值型數據設置為0,布爾型數據設置為false,所有對象變量設置為null.
如果類中提供了至少一個構造器,但是沒有提供無參數的構造器,則在構建對象時如果沒有提供參數就會被視為不合法.例如為Employee類提供一個簡單的構造器,不提供無參數構造器.
Employee(String n,double s){ name = n; salary = s; }
對於這個類,構造默認的雇員屬於不合法,也就是調用
Employee e = new Employee();
將會產生錯誤.
請記住,僅當類沒有提供任何構造器的時候,系統才會提供一個默認的構造器.如果在編寫類的時候,給出了一個構造器,哪怕是很簡單的,要是想讓這個類的用戶能夠采用如下方式構造實例:
ClassName c = new ClassName();就必須提供一個默認的構造器(即不帶參數的構造器).如果希望所有域被賦予默認值,可以采用下列方式
public ClassName(){ }
