每次在創建實例變量,對類中的所有變量都要初始化是很乏味的。即使你對setDim ( ) 這樣的方法增加有用的功能時,你也不得不這樣做。假如在一個對象最初被創建時就把對它的設置做好,那樣的話,程序將更簡單并且更簡明。因為對初始化的要求是共同的,java 答應對象在他們被創造時初始化自己。這種自動的初始化是通過使用構造函數來完成的。
構造函數(constrUCtor )在對象創建時初始化。它與它的類同名,它的語法與方法類似。一旦定義了構造函數,在對象創建后,在new運算符完成前,構造函數立即自動調用。構造函數看起來有點希奇,因為它沒有任何返回值,即使是void 型的值也不返回。這是因為一個類的構造函數內隱藏的類型是它自己類的類型。構造函數的任務就是初始化一個對象的內部狀態,以便使創建的實例變量能夠完全初始化,可以被對象馬上使用。
你可以重寫Box 例子程序,以便當對象創建時盒子的尺寸能被自動地初始化。為了達到這個目的,用構造函數代替setDim 。讓我們由定義僅僅將每個盒子的尺寸設置為同樣值的一個簡單的構造函數開始。示例如下:
/* Here,Box uses a constructor to initialize the
dimensions of a box.
*/
class Box {
double width; double height; double depth;
// This is the constructor for Box.
Box() {
System.out.PRintln("Constructing Box");
width = 10;
height = 10;
depth = 10;
}
// compute and return volume double volume() { return width * height * depth;}}
class BoxDemo6 {
public static void main(String args[]) { // declare,allocate,and initialize Box objectsBox mybox1 = new Box();Box mybox2 = new Box();
double vol;
// get volume of first box
vol = mybox1.volume();
System.out.println("Volume is " + vol);
// get volume of second box
vol = mybox2.volume();
System.out.println("Volume is " + vol);
}
}
運行該程序,產生如下的結果:
Constructing Box
Constructing Box
Volume is 1000.0
Volume is 1000.0
正如你能看到的一樣,當mybox1 和mybox2 被創建時,它們兩個都被Box 構造函數初始化。因為構造函數將所有的盒子賦為一樣的尺寸,長、寬、高都是10,mybox1 和 mybox2 將有一樣的體積。在Box( )內的println( ) 語句僅僅是為說明的緣故。大多數構造函數的功能不顯示任何東西,他們僅簡單地初始化一個對象。
在繼續學習前,讓我們再考察new運算符。你已經知道,當分配一個對象時,使用下面的通用格式:
class-var = new classname( );
現在你可以理解為什么在類的名字后面需要圓括號。圓括號的作用是調用該類的構造函數。這樣,在下面的這行中
Box mybox1 = new Box();
new Box( ) 調用Box( )構造函數。假如你不顯式為類定義一個構造函數,Java 將為該類創建一個默認的構造函數。這就是本行程序在Box早期版本沒有定義構造函數工作的原因。
默認構造函數自動地將所有的實例變量初始化為零。默認構造函數對簡單的類是足夠的,但是對更復雜的類它就不能滿足要求了。一旦你定義了你自己的構造函數,默認構造函數將不再被使用。
新聞熱點
疑難解答