1. 程式人生 > 實用技巧 >學習java第五天

學習java第五天

1. 方法概述

1.1 方法的概念

方法(method)是將具有獨立功能的程式碼塊組織成為一個整體,使其具有特殊功能的程式碼集

  • 注意:

    • 方法必須先建立才可以使用,該過程成為方法定義

    • 方法建立後並不是直接可以執行的,需要手動使用後,才執行,該過程成為方法呼叫

2. 方法的定義和呼叫

2.1 無引數方法定義和呼叫

  • 定義格式:

    public static void 方法名 (  ) {
    // 方法體;
    }
  • 範例:

    public static void method (   ) {
    // 方法體;
    }
  • 呼叫格式:

    方法名();
  • 範例:

    method();
  • 注意:

    方法必須先定義,後呼叫,否則程式將報錯

2.2 方法的呼叫過程

  • 總結:每個方法在被呼叫執行的時候,都會進入棧記憶體,並且擁有自己獨立的記憶體空間,方法內部程式碼呼叫完畢之後,會從棧記憶體中彈棧消失。

2.3 方法練習-奇偶數判斷

  • 需求:判斷一個數是奇數還是偶數

  • 程式碼:

public class Demo1Method {
/*

帶引數方法的定義格式:
public static void 方法名 ( 引數 ) { … … }
public static void 方法名 ( 資料型別 變數名 ) { … … }

帶引數方法的呼叫格式:
方法名 ( 引數 ) ;
方法名 ( 變數名/常量值 ) ;

tips: 引數可以是一個, 也可以是多個.

需求: 判斷一個數是奇數還是偶數
*/
public static void main(String[] args) {
isEvenNumber(10);
}

public static void isEvenNumber(int num){
if(num % 2 == 0){
System.out.println("偶數");
}else{
System.out.println("奇數");
}
}
}

3. 帶引數方法的定義和呼叫

3.1 帶引數方法定義和呼叫

  • 定義格式:

    引數:由資料型別和變數名組成 - 資料型別 變數名

    引數範例:int a

    public static void 方法名 (引數1) {
    方法體;
    }

    public static void 方法名 (引數1, 引數2, 引數3...) {
    方法體;
    }
  • 範例:

    public static void isEvenNumber(int number){
    ...
    }
    public static void getMax(int num1, int num2){
    ...
    }
    • 注意:

      方法定義時,引數中的資料型別與變數名都不能缺少,缺少任意一個程式將報錯

      方法定義時,多個引數之間使用逗號( ,)分隔
  • 呼叫格式:

    方法名(引數)

    方法名(引數1,引數2);
  • 範例:

    isEvenNumber(10);

    getMax(10,20);
    • 方法呼叫時,引數的數量與型別必須與方法定義中的設定相匹配,否則程式將報錯

3.2 形參和實參

  1. 形參:方法定義中的引數

等同於變數定義格式,例如:int number

  1. 實參:方法呼叫中的引數

等同於使用變數或常量,例如: 10 number

3.3 帶引數方法的練習-列印n-m之間所有的奇數

  • 需求:設計一個方法(print) 用於列印 n 到 m 之間所有的奇數

  • 思路:

    1:定義方法,名稱為print 2:為方法新增兩個int型別的形參,準備接受呼叫者傳遞過來的實參 3:方法中設計for迴圈,迴圈從n開始,到m結束 4:迴圈中加入if判斷,是奇數,則列印 5:main方法中呼叫print方法,傳入兩個實際引數

  • 程式碼:

package com.itheima.method2;

public class Demo2Method {
public static void main(String[] args) {
// 5:main方法中呼叫print方法,傳入兩個實際引數
print(20,10);
}

//1:定義方法,名稱為print
// 2:為方法新增兩個int型別的形參,準備接受呼叫者傳遞過來的實參
public static void print(int n, int m){
System.out.println(n + "到" + m + "之間的奇數為:");
// 3:方法中設計for迴圈,迴圈從n開始,到m結束
for(int i = 20; i <= 10; i++){
// 4:迴圈中加入if判斷,是奇數,則列印
if(i % 2 == 1){
System.out.println(i);
}
}
}

}

4. 帶返回值方法的定義和呼叫

4.1 帶返回值方法定義和呼叫(掌握)

  • 定義格式

    public static 資料型別 方法名 ( 引數 ) { 
    return 資料 ;
    }
  • 範例

    public static boolean isEvenNumber( int number ) {      
    return true ;
    }
    public static int getMax( int a, int b ) {
    return 100 ;
    }
    • 注意:

      • 方法定義時return後面的返回值與方法定義上的資料型別要匹配,否則程式將報錯

  • 呼叫格式

    方法名 ( 引數 ) ;
    資料型別 變數名 = 方法名 ( 引數 ) ;
  • 範例

    isEvenNumber ( 5 ) ;
    boolean flag = isEvenNumber ( 5 );
    • 注意:

      • 方法的返回值通常會使用變數接收,否則該返回值將無意義

4.2 帶返回值方法的練習-求兩個數的最大值(應用)

  • 需求:設計一個方法可以獲取兩個數的較大值,資料來自於引數

  • 思路:

    1. 定義一個方法,宣告兩個形參接收計算的數值,求出結果並返回

    2. 使用 if 語句 得出 a 和 b 之間的最大值,根據情況return具體結果

    3. 在main()方法中呼叫定義好的方法並使用 【 變數儲存 】

  • 程式碼:

     /*
    需求:設計一個方法可以獲取兩個數的較大值,資料來自於引數

    1. 定義一個方法,宣告兩個形參接收計算的數值,求出結果並返回
    2. 使用 if 語句 得出 a 和 b 之間的最大值,根據情況return具體結果
    3. 在main()方法中呼叫定義好的方法並使用 【 變數儲存 】
    */
    public static void main(String[] args) {
    // 3. 在main()方法中呼叫定義好的方法並使用 【 變數儲存 】
    System.out.println(getMax(10,20)); // 輸出呼叫

    int result = getMax(10,20);
    System.out.println(result);

    for(int i = 1; i <= result; i++){
    System.out.println("HelloWorld");
    }

    }

    // 方法可以獲取兩個數的較大值
    public static int getMax(int a, int b){
    if(a > b){
    return a;
    }else{
    return b;
    }
    }

    }

5. 方法的注意事項

5.1 方法的通用格式(掌握)

  • 格式:

    public static 返回值型別 方法名(引數) {
       方法體; 
       return 資料 ;
    }
  • 解釋:

    • public static 修飾符,目前先記住這個格式

      返回值型別 方法操作完畢之後返回的資料的資料型別

      如果方法操作完畢,沒有資料返回,這裡寫void,而且方法體中一般不寫return

      方法名 呼叫方法時候使用的標識

      引數 由資料型別和變數名組成,多個引數之間用逗號隔開

      方法體 完成功能的程式碼塊

      return 如果方法操作完畢,有資料返回,用於把資料返回給呼叫者

  • 定義方法時,要做到兩個明確

    • 明確返回值型別:主要是明確方法操作完畢之後是否有資料返回,如果沒有,寫void;如果有,寫對應的資料型別

    • 明確引數:主要是明確引數的型別和數量

  • 呼叫方法時的注意:

    • void型別的方法,直接呼叫即可

    • 非void型別的方法,推薦用變數接收呼叫

5.2 方法的注意事項

  • 方法不能巢狀定義

    • 示例程式碼:

      public class MethodDemo {
          public static void main(String[] args) {
      
          }
      
          public static void methodOne() {
      		public static void methodTwo() {
             		// 這裡會引發編譯錯誤!!!
          	}
          }
      }
  • void表示無返回值,可以省略return,也可以單獨的書寫return,後面不加資料

    • 示例程式碼:

      public class MethodDemo {
          public static void main(String[] args) {
      
          }
          public static void methodTwo() {
              //return 100; 編譯錯誤,因為沒有具體返回值型別
              return;	
              //System.out.println(100); return語句後面不能跟資料或程式碼
          }
      }

6. 方法過載

6.1 方法過載

  • 方法過載概念

    方法過載指同一個類中定義的多個方法之間的關係,滿足下列條件的多個方法相互構成過載

    • 多個方法在同一個類中

    • 多個方法具有相同的方法名

    • 多個方法的引數不相同,型別不同或者數量不同

  • 注意:

    • 過載僅對應方法的定義,與方法的呼叫無關,呼叫方式參照標準格式

    • 過載僅針對同一個類中方法的名稱與引數進行識別,與返回值無關,換句話說不能通過返回值來判定兩個方法是否相互構成過載

  • 正確範例:

    public class MethodDemo {
    	public static void fn(int a) {
        	//方法體
        }
        public static int fn(double a) {
        	//方法體
        }
    }
    
    public class MethodDemo {
    	public static float fn(int a) {
        	//方法體
        }
        public static int fn(int a , int b) {
        	//方法體
        }
    }
  • 錯誤範例:

    public class MethodDemo {
    	public static void fn(int a) {
        	//方法體
        }
        public static int fn(int a) { 	/*錯誤原因:過載與返回值無關*/
        	//方法體
        }
    }
    
    public class MethodDemo01 {
        public static void fn(int a) {
            //方法體
        }
    } 
    public class MethodDemo02 {
        public static int fn(double a) { /*錯誤原因:這是兩個類的兩個fn方法*/
            //方法體
        }
    }

6.2 方法過載練習

  • 需求:使用方法過載的思想,設計比較兩個整數是否相同的方法,相容全整數型別(byte,short,int,long)

  • 思路:

    ①定義比較兩個數字的是否相同的方法compare()方法,引數選擇兩個int型引數

    ②定義對應的過載方法,變更對應的引數型別,引數變更為兩個long型引數

    ③定義所有的過載方法,兩個byte型別與兩個short型別引數

    ④完成方法的呼叫,測試執行結果

  • 程式碼:

    public class MethodTest {
        public static void main(String[] args) {
            //呼叫方法
            System.out.println(compare(10, 20));
            System.out.println(compare((byte) 10, (byte) 20));
            System.out.println(compare((short) 10, (short) 20));
            System.out.println(compare(10L, 20L));
        }
    
        //int
        public static boolean compare(int a, int b) {
            System.out.println("int");
            return a == b;
        }
    
        //byte
        public static boolean compare(byte a, byte b) {
            System.out.println("byte");
            return a == b;
        }
    
        //short
        public static boolean compare(short a, short b) {
            System.out.println("short");
            return a == b;
        }
    
        //long
        public static boolean compare(long a, long b) {
            System.out.println("long");
            return a == b;
        }
    
    }

7. 方法的引數傳遞

7.1 方法引數傳遞基本型別(理解)

  • 測試程式碼:

    package com.itheima.param;
    
    public class Test1 {
        /*
             方法引數傳遞為基本資料型別 :
    
                    傳入方法中的, 是具體的數值.
         */
        public static void main(String[] args) {
            int number = 100;
            System.out.println("呼叫change方法前:" + number);
            change(number);
            System.out.println("呼叫change方法後:" + number);
        }
    
        public static void change(int number) {
            number = 200;
        }
    }
    
    
  • 結論:

    • 基本資料型別的引數,形式引數的改變,不影響實際引數

  • 結論依據:

    • 每個方法在棧記憶體中,都會有獨立的棧空間,方法執行結束後就會彈棧消失

7.2 方法引數傳遞引用型別

  • 測試程式碼:

    package com.itheima.param;
    
    public class Test2 {
        /*
             方法引數傳遞為引用資料型別 :
    
                    傳入方法中的, 是記憶體地址.
         */
        public static void main(String[] args) {
            int[] arr = {10, 20, 30};
            System.out.println("呼叫change方法前:" + arr[1]);
            change(arr);
            System.out.println("呼叫change方法後:" + arr[1]);
        }
    
        public static void change(int[] arr) {
            arr[1] = 200;
        }
    }
  • 結論:

    • 對於引用型別的引數,形式引數的改變,影響實際引數的值

  • 結論依據:

    • 引用資料型別的傳參,傳入的是地址值,記憶體中會造成兩個引用指向同一個記憶體的效果,所以即使方法彈棧,堆記憶體中的資料也已經是改變後的結果

7.3 陣列遍歷

  • 需求:設計一個方法用於陣列遍歷,要求遍歷的結果是在一行上的。例如:[11, 22, 33, 44, 55]

  • 思路:

    • 因為要求結果在一行上輸出,所以這裡需要在學習一個新的輸出語句System.out.print(“內容”);

      System.out.println(“內容”); 輸出內容並換行

      System.out.print(“內容”); 輸出內容不換行

      System.out.println(); 起到換行的作用

    • 定義一個數組,用靜態初始化完成陣列元素初始化

    • 定義一個方法,用陣列遍歷通用格式對陣列進行遍歷

    • 用新的輸出語句修改遍歷操作

    • 呼叫遍歷方法

  • 程式碼:

    package com.itheima.test;

    public class Test1 {
    /*
    需求:設計一個方法用於陣列遍歷,要求遍歷的結果是在一行上的。例如:[11, 22, 33, 44, 55]
    思路:
    1.定義一個數組,用靜態初始化完成陣列元素初始化
    2.定義一個方法,對陣列進行遍歷
    3.遍歷列印的時候,資料不換行
    4.呼叫遍歷方法
    */
    public static void main(String[] args) {
    // 1.定義一個數組,用靜態初始化完成陣列元素初始化
    int[] arr = {11, 22, 33, 44, 55};
    // 4.呼叫遍歷方法
    printArray(arr);

    System.out.println("另外一段程式碼邏輯 ");
    }

    /*
    2.定義一個方法,對陣列進行遍歷

    1, 引數 int[] arr
    2, 返回值型別 void
    */
    public static void printArray(int[] arr){

    System.out.print("[");

    for (int i = 0; i < arr.length; i++) {

    if(i == arr.length -1){
    // 如果滿足條件, 說明是最後一個元素, 最後一個元素, 特殊處理
    System.out.println(arr[i] + "]");
    }else{
    // 3.遍歷列印的時候,資料不換行
    System.out.print(arr[i] + ", ");
    }


    }
    }
    }

7.4 陣列最大值

  • 需求:設計一個方法用於獲取陣列中元素的最大值

  • 思路:

    • ①定義一個數組,用靜態初始化完成陣列元素初始化

    • ②定義一個方法,用來獲取陣列中的最大值,最值的認知和講解我們在陣列中已經講解過了

    • ③呼叫獲取最大值方法,用變數接收返回結果

    • ④把結果輸出在控制檯

  • 程式碼:

    package com.itheima.test;

    public class Test2 {
    /*
    需求:設計一個方法用於獲取陣列中元素的最大值

    思路:
    1.定義一個數組,用靜態初始化完成陣列元素初始化
    2.定義一個方法,用來獲取陣列中的最大值
    3.呼叫獲取最大值方法,用變數接收返回結果
    4.把結果輸出在控制檯
    */
    public static void main(String[] args) {
    // 1.定義一個數組,用靜態初始化完成陣列元素初始化
    int[] arr = {11, 55, 22, 44, 33};
    // 3.呼叫獲取最大值方法,用變數接收返回結果
    int max = getMax(arr);
    // 4.把結果輸出在控制檯
    System.out.println(max);
    }

    /*
    2.定義一個方法,用來獲取陣列中的最大值

    1, 引數 int[] arr
    2, 返回值型別 int
    */
    public static int getMax(int[] arr){
    int max = arr[0];
    for (int i = 1; i < arr.length; i++) {
    if(max < arr[i]){
    max = arr[i];
    }
    }
    return max;
    }
    }

7.5 方法同時獲取陣列最大值和最小值

  • 需求:設計一個方法,該方法能夠同時獲取陣列的最大值,和最小值

  • 注意: return語句, 只能帶回一個結果.

  • 程式碼:

    public class Test3 {
    /*
    需求:設計一個方法,該方法能夠同時獲取陣列的最大值,和最小值

    注意: return語句, 只能帶回一個結果.
    */
    public static void main(String[] args) {

    int[] arr = {11,55,33,22,44};

    int[] maxAndMin = getMaxAndMin(arr);

    System.out.println(maxAndMin[0]);
    System.out.println(maxAndMin[1]);

    }

    public static int[] getMaxAndMin(int[] arr){
    int max = arr[0];
    for (int i = 1; i < arr.length; i++) {
    if(max < arr[i]){
    max = arr[i];
    }
    }

    int min = arr[0];
    for (int i = 1; i < arr.length; i++) {
    if(min > arr[i]){
    min = arr[i];
    }
    }

    int[] maxAndMin = {min, max};

    return maxAndMin;
    }
    }