Java 面向物件(四)類的成員 之 方法
一、方法
1、什麼是方法(method、函式)
(1)方法是類或物件行為特徵的抽象,用來完成某個功能操作。在某些語言中也稱為函式或過程;
(2)將功能封裝為方法的目的是,可以實現程式碼重用,簡化程式碼,解決程式碼冗餘的現象;
(3)Java 裡的方法不能獨立存在,所有的方法必須定義在類裡;
2、方法的宣告
方法的宣告格式:
修飾符 返回值型別 方法名(引數型別 形參2,引數型別 形參2,...){
方法體程式程式碼;
return 返回值;
}
(1)修飾符:public、預設、private、protected 等;
(2)返回值型別:① 沒有返回值:void;② 有返回值,宣告出返回值的型別,與方法體中“return 返回值” 搭配使用;
(3)方法名:屬於識別符號,命名時遵循識別符號命名規則和規範,“見名知意”。(採用小駝峰命名)
(4)形參列表:可以包含零個、一個或多個引數。多個引數時,中間用 “,”隔開;
(5)返回值:方法在執行完畢後返還給呼叫它的程式的資料;
三要素:返回值型別;方法名稱;引數列表;
定義方法的注意事項:
-
- 方法必須定義在類中方法外面;
- 方法定義的先後順序無所謂;
- 方法不能定義在另一個方法的裡面,即不能產生巢狀包含關係;
- 如果方法有返回值,那麼必須寫上“return 返回值;
- 返回值型別,必須要和 return 語句返回的型別相同,否則編譯失敗;
- 不能在 return 後面寫程式碼,return 意味著方法結束,所有後面的程式碼永遠不會執行,屬於無效程式碼;
- 對於一個 void 沒有返回值的方法,不能寫 return 後面的返回值,只能寫 return 自己。
- 對於 void 方法當中最後一行的 return 可以省略不寫。
- 一個方法當中可以有多個 return 語句,但是必須保證同時只有一個會被執行到,兩個 return 不能連寫。
3、方法的分類:按照是否有形參及返回值
(1)如果方法有返回值,則必須在方法宣告時,指定返回值的型別。同時,方法中,需要使用 return 關鍵字來返回指定型別的變數或常量:“return 資料”。
(2)如果方法沒有返回值,則方法宣告時,使用 void 來表示。通常,沒有返回值的方法,就不需要使用 return。但是,如果使用的話,只能“return;”表示結束此方法的意思。
Tips:其中,寫在方法括號中的引數稱為形參,而在實際呼叫中的引數稱為實參。
4、return 關鍵字的使用
(1)使用範圍:使用在方法體中;
(2)作用:① 結束方法
② 針對於有返回值型別的方法,使用"return 資料"方法返回所要的資料。
(3)注意點:return關鍵字後面不可以宣告執行語句。
注意:方法的使用中,可以呼叫當前類的屬性或方法,但是不能在方法中定義方法。
二、方法的呼叫
1、方法的呼叫
方法通過方法名被呼叫,且只有被呼叫才會執行。
(1)如果本類中同級別方法呼叫:直接呼叫即可。
【變數 = 】 方法名(【實參列表】);
(2)在其他類中的方法呼叫:
【變數 = 】 物件名.方法名(【實參列表】);
注意:
①是否傳入實參:看被呼叫的方法是否有形參;
②是否接受返回值:看被呼叫的方法是否為 void,如果是 void,就不需要也不能接受;如果不是void,可以接受返回值。
2、方法呼叫的過程分析
3、呼叫方法的三種形式
(1)直接呼叫:直接寫方法名呼叫;
(2)賦值呼叫:呼叫方法,在方法前面定義變數,接收方法返回值資料型別 變數名稱 = 方法名稱(引數);
(3)輸出語句呼叫:在輸出語句中呼叫方法,System.out.println(方法名())。不能用輸出語句呼叫 void 型別的方法。因為方法執行後沒有結果,也就打印不出任何內容。
4、方法的呼叫格式要與方法的宣告格式對應
(1)是否要加"物件":看是否在本類中,還是在其他類中
(2)是否要接受返回值:看被呼叫方法是否是 void
(3) 是否要傳實參:看被呼叫方法是否有形參列表
3、注意點
(1)方法被呼叫一次,就會執行一次;
(2)沒有具體返回值的情況,返回值型別用關鍵字 void 表示,那麼方法體可以不必使用 return 語句。如果使用,僅用來結束方法。
(3)定義方法時,方法的結果應該返回給呼叫者,交由呼叫者處理;
(4)方法中只能呼叫方法或屬性,不可以在方法內部定義方法。
三、方法的過載(overLoad)
1、過載
在同一個類中,允許存在一個以上的同名方法,只要它們的引數個數或者引數型別不同即可。
2、特點
與許可權訪問修飾符、返回值型別、形參變數名、方法體都無關,只看引數列表,且引數列表必須不同。(引數個數或引數型別)。呼叫時,根據方法引數列表的不同來區別。
3、案例:
1 public void getSum(int i,int j){
2 System.out.println("1");
3 }
4
5 public void getSum(double d1,double d2){
6 System.out.println("2");
7 }
8
9 public void getSum(String s ,int i){
10 System.out.println("3");
11 }
12
13 public void getSum(int i,String s){
14 System.out.println("4");
15 }
4、
四、可變形參的方法
1、可變個數的形參
JavaSE 5.0 中提供了Varargs(variable number of arguments)機制,允許直接定義能和多個實參相匹配的形參。從而,可以用一種更簡單的方式,來傳遞個數可變的實參。
2、使用
//JDK 5.0以前: 採用陣列形參來定義方法,傳入多個同一型別變數
public static void test(int a ,String[] books);
//JDK5.0: 採用可變個數形參來定義方法,傳入多個同一型別變數
public static void test(int a ,String…books);
3、說明
(1)宣告格式: 方法名(引數的型別名 ... 引數名);
(2)可變引數:方法引數部分指定型別額引數個數是可變多個:0個,1個或多個;
(3)可變個數形參的方法與同名的方法之間,彼此構成過載;
(4)可變引數方法的使用與方法引數部分使用陣列的一致的,所以,在一個類中,二者不能共存;
(5)方法的引數部分有可變形參,需要放在形參宣告的最後;
(6)在一個方法的形參位置,最多隻能宣告一個可變個數形參;
4、案例:
1 public void show(String s){
2 System.out.println("show(String)");
3 }
4
5 public void show(String ... strs){
6 System.out.println("show(String ... strs)");
7
8 for(int i = 0;i < strs.length;i++){
9 System.out.println(strs[i]);
10 }
11 }
12 //不能與上一個方法同時存在,不能與陣列型別的方法同時存在
13 // public void show(String[] strs){
14 //
15 // }
16
17 //The variable argument type String of the method
18 //show must be the last parameter
19 // public void show(String ...strs,int i){
20 //
21 // }
注意:對於這種可變引數的方法,其實也是用陣列來處理的,等前面幾個滿足形參後,後面就全部屬於可變引數,所以只能有一個,並且還需要放在最後。
五、方法引數的值傳遞機制
六、遞迴方法
1、遞迴方法:一個方法體內呼叫它自身
2、遞迴方法
(1)方法遞迴包含了一種隱式的迴圈,它會重複執行某段程式碼,但這種重複執行無須迴圈控制;
(2)遞迴一定要向已知方法遞迴,否則這種遞迴就變成了無窮遞迴,類似於死迴圈。會報(Stack OverflowError【棧空間溢位】)
3、案例
1 // 例1:計算1-n之間所有自然數的和
2 public int getSum(int n) {// 3
3
4 if (n == 1) {
5 return 1;
6 } else {
7 return n + getSum(n - 1);
8 }
9
10 }
11
12 // 例2:計算1-n之間所有自然數的乘積:n!
13 public int getSum1(int n) {
14
15 if (n == 1) {
16 return 1;
17 } else {
18 return n * getSum1(n - 1);
19 }
20
21 }
22
23 //例3:已知有一個數列:f(0) = 1,f(1) = 4,f(n+2)=2*f(n+1) + f(n),
24 //其中n是大於0的整數,求f(10)的值。
25 public int f(int n){
26 if(n == 0){
27 return 1;
28 }else if(n == 1){
29 return 4;
30 }else{
31 return 2*f(n - 1) + f(n - 2);
32 }
33 }
經典案例:
(1)斐波那契數列
(2)漢諾塔問題
(3)快速排序