java 方法(轉)

ba發表於2007-08-15
java 方法(轉)[@more@]在本章的開始提到,類通常由兩個要素組成:例項變數和方法。方法是個很大的話題,因為Java 給他們如此大的功能和靈活性。事實上,下一章的大部分都用來介紹方法。然而,你現在需要學習一些基礎以便你能開始把方法加到你的類中。

這是方法一般的形式:

type name(parameter-list) {
// body of method
}

其中,type 指定了方法返回的資料型別。這可以是任何合法有效的型別,包括你建立的類的型別。如果該方法不返回任何值,則它的返回值type 必須為void 。方法名由name 指定。除了被當前作用域中的其他項使用的識別符號以外,方法名可以是任何合法的識別符號。parameter-list (自變數列表)是一系列型別和識別符號對,用逗號分開。自變數本質上是變數,它接收方法被呼叫時傳遞給方法的引數值。如果方法沒有自變數,那麼自變數列表就為空。

對於不返回void 型別的方法,使用下面格式的return語句,方法返回值到它的呼叫程式:

return value;

其中,value 是返回的值。接下來,你將看到怎樣建立多種型別的方法,包括帶引數的和那些有返回值的方法。

6.4.1 為Box類新增一個方法

儘管建立一個僅包含資料的類是相當不錯的事情,但這樣的情況很少發生。大部分情況是你將使用方法存取由類定義的例項變數。事實上,方法定義大多數類的介面。這允許類實現函式可以把內部資料結構的特定佈局隱蔽到方法抽象後面。除了定義提供資料的存取的方法,你也可以定義被類的內部自己所使用的方法。

讓我們由對Box 類增加一個方法開始。回顧一下前面計算盒子體積的例子,你會發現用Box 類有時會比使用BoxDemo 類能更好地處理這個問題。不管怎麼說,一個盒子的體積依賴於盒子的大小,這就是我們想到用Box類來計算盒子的體積。為了做到這一點,你必須對Box類增加一個方法,示例如下:

// This program includes a method inside the box class.

class Box { double width; double height; double depth;

// display volume of a box void volume() { System.out.print("Volume is ");
System.out.println(width * height * depth);
}
}

class BoxDemo3 {

public static void main(String args[]) {
Box mybox1 = new Box();
Box mybox2 = new Box();

// assign values to mybox1's instance variables
mybox1.width = 10;
mybox1.height = 20;
mybox1.depth = 15;

/* assign different values to mybox2's

instance variables */
mybox2.width = 3;
mybox2.height = 6;
mybox2.depth = 9;

// display volume of first box
mybox1.volume();

// display volume of second box
mybox2.volume();
}
}

該程式產生的輸出如下,與先前版本程式的輸出一樣。

Volume is 3000.0
Volume is 162.0

注意看下面兩行程式:

mybox1.volume ();
mybox2.volume ();

該例的第一行呼叫mybox1 的volume() 方法。也就是,它使用物件名加點號運算子呼叫mybox1 物件的volume() 方法。這樣,呼叫mybox1.volume( ) 顯示mybox1 定義的盒子的體積,呼叫mybox2.volume ()將顯示mybox2 定義的盒子的體積。每次呼叫volume() ,它都會顯示指定物件的體積。

如果你對方法呼叫的概念比較陌生,下列的討論將有助於澄清該概念。當mybox1.volume ( ) 被執行時,Java 執行系統將程式控制轉移到volume( ) 定義內的程式碼。當volume( ) 內的語句執行後,程式控制返回撥用者,然後執行程式呼叫的下一行語句。Java 執行方法的過程類似於子程式的執行。

在volume() 方法中有一些需要注意的地方:例項變數width,height 和depth 被直接引用,並沒有在它們前面加物件名或點號運算子。當一個方法使用由它的類定義的例項變數時,它可以直接這樣做,而不必使用顯式的物件引用和使用點號運算子。這是很容易理解的。一個方法總是被它的類的物件呼叫。只要這個呼叫過程一發生,物件就是可見的。因此,在方法中就沒有必要二次指定物件了。這意味著,volume() 中的width,height 和depth 已經隱含地引用了呼叫volume() 方法中的這些變數的複製。

讓我們複習一下:當一個例項變數不是被該例項變數所在類的部分程式碼訪問時,它必須透過該物件加點運算子來訪問。但是當一個例項變數被定義該變數的類的程式碼訪問時,該變數可以被直接引用。同樣的規則也適用於方法。

6.4.2 返回值
執行volume() 方法確實將計算盒子體積的值返回到Box類,但這並不是最好的方法。例如,你的程式的其他部分如何知道一個盒子的體積,而不顯示它的值?一個更好地實現 volume() 的方法是將它計算的盒子體積的結果返回給它的呼叫者。下面的例子是對前面程式的改進,它正是這樣做的:

// Now,volume() returns the volume of a box.

class Box { double width; double height; double depth;

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

class BoxDemo4 {

public static void main(String args[]) {
Box mybox1 = new Box();
Box mybox2 = new Box();
double vol;

// assign values to mybox1's instance variables
mybox1.width = 10;
mybox1.height = 20;
mybox1.depth = 15;

/* assign different values to mybox2's

instance variables */
mybox2.width = 3;
mybox2.height = 6;
mybox2.depth = 9;

// 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() 被呼叫時,它被放在賦值語句的右邊。左邊是接收volume() 返回值的變數。因此,當下面的語句執行後,

vol = mybox1.volume();

變數mybox1.volume ( ) 的值是 3,000,且該值被儲存在vol 中。

對於返回值的理解,要注意下面兩件重要的事情:

·
方法返回的資料型別必須與該方法指定的返回型別相相容。例如,如果一個方法的返回值是布林型,就不可能返回整數。
·接收方法返回值的變數
(例如本例中的變數 vol) 也必須與指定方法返回值的型別相相容。
另外一點:因為實際上不需要vol 變數,前面的程式可以被寫得更高效一些。對volume( ) 方法的呼叫可以直接用在println ( ) 語句中,如下面的語句:

System.out.println("Volume is " + mybox1.volume());

在本例中,當println ( ) 被執行時,mybox1.volume ( ) 將自動地被呼叫,而且它的值會被傳遞給println ( ) 。

6.4.3 加入帶自變數的方法
大多數方法不需要自變數。自變數對方法沒有特殊要求。也就是說,帶自變數的方法,可以完成各種資料操作,它還可以用在很多有微妙差別的情況。為了說明這一點,讓我們舉一個非常簡單的例子。下面的方法返回數字10的平方:

int square()

{ return 10 * 10;

}

執行該方法,確實返回了10 的平方的值,但它的使用是很有限的。然而,如下所示,如果你修改該方法,以便它帶一個自變數,這樣square( ) 就更有用了。

int square(int i)

{ return i * i;

}

現在,square() 可以返回任何呼叫它的值的平方。也就是說,square() 現在是可以計算任何整數值的平方的一個通用方法,而不單純是數字10 。

下面是一個例子:

int x,y;x = square(5); // x equals 25x = square(9); // x equals 81y = 2;x = square(y); // x equals 4

在第一次呼叫square( ) 時,值5被傳遞給自變數i。在第二次呼叫時,i接收到值9。第三次呼叫時,將值傳遞給y,在本例中是 2 。如這些例子所示,square ( ) 可以返回傳遞給它的任何資料的平方。

區分自變數(parameter )和引數(argument )這兩個術語是很重要的。自變數是方法定義的一個變數,當方法被呼叫時,它接收一個值。例如在square() 中,i就是一個自變數。引數是當一個方法被呼叫時,傳遞給該方法的值。例如,square(100) 把100 作為引數傳遞。在square()中,自變數i接收該值。

可以使用一個帶自變數的方法來改進Box 類。在前面的例子中,每個盒子的尺寸不得不用單獨的語句順序的來設定,例如:

mybox1.width = 10;
mybox1.height = 20;
mybox1.depth = 15;

本例中的程式碼在執行時,它在兩個方面比較麻煩。首先,它笨拙且容易發生錯誤。例如,很容易忘記設定其中的一個尺寸。其次,在設計的很好的Java 程式中,例項變數應該僅僅由定義類的方法來存取。在後面,你可以改變一個方法的行為,但是你不能改變一個暴露的例項變數的行為。

這樣,設定一個盒子尺寸的更好的途徑是建立一個自變數代表盒子尺寸的方法,而且適當地設定每個例項變數。下面的例子實現了這個想法。

// This program uses a parameterized method.

class Box { double width; double height; double depth;

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

// sets dimensions of box

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

}
}

class BoxDemo5 {

public static void main(String args[]) {
Box mybox1 = new Box();
Box mybox2 = new Box();
double vol;

// initialize each boxmybox1.setDim(10,20,15);mybox2.setDim(3,6,9);
// 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);

}
}

正如你看到的,setDim 方法用來設定每個盒子的尺寸,例如,當下面的語句執行後:mybox1.setDim(10,20,15);

10被複製進引數w,20被複製進h,15被複製進d。在setDim( ) 內的w、h、d的值分別賦給width 、height 和depth 。

許多讀者,特別是那些有C/C++ 經驗的讀者,對前面章節中的概念會比較熟悉。但是,如果像方法呼叫、引數、自變數這些概念對你來說比較新的話,在繼續學習以前,你要花些時間來練習。方法呼叫,自變數,返回值這些概念是Java 程式設計的基礎。

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

相關文章