1. 程式人生 > 實用技巧 >Java 面向物件(四)類的成員 之 方法

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)快速排序

七、