java 方法(轉(zhuǎn))[@more@]在本章的開始提到,類通常由兩個(gè)要素組成:實(shí)例變量和方法。方法是個(gè)很大的話題,因?yàn)镴ava 給他們?nèi)绱舜蟮墓δ芎挽`活性。事實(shí)上,下一章的大部分都用來介紹方法。然而,你現(xiàn)在需要學(xué)習(xí)一些基礎(chǔ)以便你能開始把方法加到你的類中。
這是方法一般的形式:
type name(parameter-list) {
// body of method
}
其中,type 指定了方法返回的數(shù)據(jù)類型。這可以是任何合法有效的類型,包括你創(chuàng)建的類的類型。如果該方法不返回任何值,則它的返回值type 必須為void 。方法名由name 指定。除了被當(dāng)前作用域中的其他項(xiàng)使用的標(biāo)識符以外,方法名可以是任何合法的標(biāo)識符。parameter-list (自變量列表)是一系列類型和標(biāo)識符對,用逗號分開。自變量本質(zhì)上是變量,它接收方法被調(diào)用時(shí)傳遞給方法的參數(shù)值。如果方法沒有自變量,那么自變量列表就為空。
對于不返回void 類型的方法,使用下面格式的return語句,方法返回值到它的調(diào)用程序:
return value;
其中,value 是返回的值。接下來,你將看到怎樣創(chuàng)建多種類型的方法,包括帶參數(shù)的和那些有返回值的方法。
6.4.1 為Box類添加一個(gè)方法
盡管創(chuàng)建一個(gè)僅包含數(shù)據(jù)的類是相當(dāng)不錯(cuò)的事情,但這樣的情況很少發(fā)生。大部分情況是你將使用方法存取由類定義的實(shí)例變量。事實(shí)上,方法定義大多數(shù)類的接口。這允許類實(shí)現(xiàn)函數(shù)可以把內(nèi)部數(shù)據(jù)結(jié)構(gòu)的特定布局隱蔽到方法抽象后面。除了定義提供數(shù)據(jù)的存取的方法,你也可以定義被類的內(nèi)部自己所使用的方法。
讓我們由對Box 類增加一個(gè)方法開始。回顧一下前面計(jì)算盒子體積的例子,你會(huì)發(fā)現(xiàn)用Box 類有時(shí)會(huì)比使用BoxDemo 類能更好地處理這個(gè)問題。不管怎么說,一個(gè)盒子的體積依賴于盒子的大小,這就是我們想到用Box類來計(jì)算盒子的體積。為了做到這一點(diǎn),你必須對Box類增加一個(gè)方法,示例如下:
// 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();
}
}
該程序產(chǎn)生的輸出如下,與先前版本程序的輸出一樣。
Volume is 3000.0
Volume is 162.0
注意看下面兩行程序:
mybox1.volume ();
mybox2.volume ();
該例的第一行調(diào)用mybox1 的volume() 方法。也就是,它使用對象名加點(diǎn)號運(yùn)算符調(diào)用mybox1 對象的volume() 方法。這樣,調(diào)用mybox1.volume( ) 顯示mybox1 定義的盒子的體積,調(diào)用mybox2.volume ()將顯示mybox2 定義的盒子的體積。每次調(diào)用volume() ,它都會(huì)顯示指定對象的體積。
如果你對方法調(diào)用的概念比較陌生,下列的討論將有助于澄清該概念。當(dāng)mybox1.volume ( ) 被執(zhí)行時(shí),Java 運(yùn)行系統(tǒng)將程序控制轉(zhuǎn)移到volume( ) 定義內(nèi)的代碼。當(dāng)volume( ) 內(nèi)的語句執(zhí)行后,程序控制返回調(diào)用者,然后執(zhí)行程序調(diào)用的下一行語句。Java 執(zhí)行方法的過程類似于子程序的運(yùn)行。
在volume() 方法中有一些需要注意的地方:實(shí)例變量width,height 和depth 被直接引用,并沒有在它們前面加對象名或點(diǎn)號運(yùn)算符。當(dāng)一個(gè)方法使用由它的類定義的實(shí)例變量時(shí),它可以直接這樣做,而不必使用顯式的對象引用和使用點(diǎn)號運(yùn)算符。這是很容易理解的。一個(gè)方法總是被它的類的對象調(diào)用。只要這個(gè)調(diào)用過程一發(fā)生,對象就是可見的。因此,在方法中就沒有必要二次指定對象了。這意味著,volume() 中的width,height 和depth 已經(jīng)隱含地引用了調(diào)用volume() 方法中的這些變量的拷貝。
讓我們復(fù)習(xí)一下:當(dāng)一個(gè)實(shí)例變量不是被該實(shí)例變量所在類的部分代碼訪問時(shí),它必須通過該對象加點(diǎn)運(yùn)算符來訪問。但是當(dāng)一個(gè)實(shí)例變量被定義該變量的類的代碼訪問時(shí),該變量可以被直接引用。同樣的規(guī)則也適用于方法。
6.4.2 返回值
執(zhí)行volume() 方法確實(shí)將計(jì)算盒子體積的值返回到Box類,但這并不是最好的方法。例如,你的程序的其他部分如何知道一個(gè)盒子的體積,而不顯示它的值?一個(gè)更好地實(shí)現(xiàn) volume() 的方法是將它計(jì)算的盒子體積的結(jié)果返回給它的調(diào)用者。下面的例子是對前面程序的改進(jìn),它正是這樣做的:
// 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);
}
}
在這個(gè)程序中,當(dāng)volume() 被調(diào)用時(shí),它被放在賦值語句的右邊。左邊是接收volume() 返回值的變量。因此,當(dāng)下面的語句執(zhí)行后,
vol = mybox1.volume();
變量mybox1.volume ( ) 的值是 3,000,且該值被保存在vol 中。
對于返回值的理解,要注意下面兩件重要的事情:
·
方法返回的數(shù)據(jù)類型必須與該方法指定的返回類型相兼容。例如,如果一個(gè)方法的返回值是布爾型,就不可能返回整數(shù)。
·接收方法返回值的變量
(例如本例中的變量 vol) 也必須與指定方法返回值的類型相兼容。
另外一點(diǎn):因?yàn)閷?shí)際上不需要vol 變量,前面的程序可以被寫得更高效一些。對volume( ) 方法的調(diào)用可以直接用在println ( ) 語句中,如下面的語句:
System.out.println("Volume is " + mybox1.volume());
在本例中,當(dāng)println ( ) 被執(zhí)行時(shí),mybox1.volume ( ) 將自動(dòng)地被調(diào)用,而且它的值會(huì)被傳遞給println ( ) 。
6.4.3 加入帶自變量的方法
大多數(shù)方法不需要自變量。自變量對方法沒有特殊要求。也就是說,帶自變量的方法,可以完成各種數(shù)據(jù)操作,它還可以用在很多有微妙差別的情況。為了說明這一點(diǎn),讓我們舉一個(gè)非常簡單的例子。下面的方法返回?cái)?shù)字10的平方:
int square()
{ return 10 * 10;
}
運(yùn)行該方法,確實(shí)返回了10 的平方的值,但它的使用是很有限的。然而,如下所示,如果你修改該方法,以便它帶一個(gè)自變量,這樣square( ) 就更有用了。
int square(int i)
{ return i * i;
}
現(xiàn)在,square() 可以返回任何調(diào)用它的值的平方。也就是說,square() 現(xiàn)在是可以計(jì)算任何整數(shù)值的平方的一個(gè)通用方法,而不單純是數(shù)字10 。
下面是一個(gè)例子:
int x,y;x = square(5); // x equals 25x = square(9); // x equals 81y = 2;x = square(y); // x equals 4
在第一次調(diào)用square( ) 時(shí),值5被傳遞給自變量i。在第二次調(diào)用時(shí),i接收到值9。第三次調(diào)用時(shí),將值傳遞給y,在本例中是 2 。如這些例子所示,square ( ) 可以返回傳遞給它的任何數(shù)據(jù)的平方。
區(qū)分自變量(parameter )和參數(shù)(argument )這兩個(gè)術(shù)語是很重要的。自變量是方法定義的一個(gè)變量,當(dāng)方法被調(diào)用時(shí),它接收一個(gè)值。例如在square() 中,i就是一個(gè)自變量。參數(shù)是當(dāng)一個(gè)方法被調(diào)用時(shí),傳遞給該方法的值。例如,square(100) 把100 作為參數(shù)傳遞。在square()中,自變量i接收該值。
可以使用一個(gè)帶自變量的方法來改進(jìn)Box 類。在前面的例子中,每個(gè)盒子的尺寸不得不用單獨(dú)的語句順序的來設(shè)置,例如:
mybox1.width = 10;
mybox1.height = 20;
mybox1.depth = 15;
本例中的代碼在執(zhí)行時(shí),它在兩個(gè)方面比較麻煩。首先,它笨拙且容易發(fā)生錯(cuò)誤。例如,很容易忘記設(shè)置其中的一個(gè)尺寸。其次,在設(shè)計(jì)的很好的Java 程序中,實(shí)例變量應(yīng)該僅僅由定義類的方法來存取。在后面,你可以改變一個(gè)方法的行為,但是你不能改變一個(gè)暴露的實(shí)例變量的行為。
這樣,設(shè)置一個(gè)盒子尺寸的更好的途徑是創(chuàng)建一個(gè)自變量代表盒子尺寸的方法,而且適當(dāng)?shù)卦O(shè)置每個(gè)實(shí)例變量。下面的例子實(shí)現(xiàn)了這個(gè)想法。
// 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 方法用來設(shè)置每個(gè)盒子的尺寸,例如,當(dāng)下面的語句執(zhí)行后:mybox1.setDim(10,20,15);
10被拷貝進(jìn)參數(shù)w,20被拷貝進(jìn)h,15被拷貝進(jìn)d。在setDim( ) 內(nèi)的w、h、d的值分別賦給width 、height 和depth 。
許多讀者,特別是那些有C/C++ 經(jīng)驗(yàn)的讀者,對前面章節(jié)中的概念會(huì)比較熟悉。但是,如果像方法調(diào)用、參數(shù)、自變量這些概念對你來說比較新的話,在繼續(xù)學(xué)習(xí)以前,你要花些時(shí)間來練習(xí)。方法調(diào)用,自變量,返回值這些概念是Java 編程的基礎(chǔ)。
網(wǎng)頁題目:java方法(轉(zhuǎn))
URL分享:http://m.newbst.com/article6/iidsig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、外貿(mào)建站、域名注冊、ChatGPT、網(wǎng)站改版、電子商務(wù)
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源:
創(chuàng)新互聯(lián)