構造java函式(轉)

ba發表於2007-08-15
構造java函式(轉)[@more@]每次在建立例項變數,對類中的所有變數都要初始化是很乏味的。即使你對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早期版本沒有定義建構函式工作的原因。
預設建構函式自動地將所有的例項變數初始化為零。預設建構函式對簡單的類是足夠的,但是對更復雜的類它就不能滿足要求了。一旦你定義了你自己的建構函式,預設建構函式將不再被使用。

6.5.1 帶自變數的建構函式
雖然在前面的例子中,Box建構函式確實初始化了Box物件,但它不是很有用,因為所有的盒子都是一樣的尺寸。我們所需要的是一種能夠構造各種各樣尺寸盒子物件的方法。比較容易的解決辦法是對建構函式增加自變數。你可能已經猜到,這將使他們更有用。例如,下面版本的Box程式定義了一個自變數建構函式,它根據自變數設定每個指定盒子的尺寸。特別注意Box 物件是如何被建立的。

/* Here,Box uses a parameterized constructor to

initialize the dimensions of a box.
*/
class Box {

double width; double height; double depth;

// This is the constructor for Box.

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

}

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

class BoxDemo7 {

public static void main(String args[]) { // declare,allocate,and initialize Box objectsBox mybox1 = new Box(10,20,15);Box mybox2 = new Box(3,6,9);

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);

}
}

該程式的輸出如下:

Volume is 3000.0
Volume is 162.0

正如你看到的,每個物件被它的建構函式指定的引數初始化。例如,在下行中,

Box mybox1 = new Box(10,20,15);

當new建立物件時,值10,20,15傳遞到Box() 建構函式。這樣,mybox1 的複製width 、height 、depth 將分別包含值10、20、15。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-958061/,如需轉載,請註明出處,否則將追究法律責任。

相關文章