方法

Chengkai730發表於2024-09-01

方法的定義

方法是程式中最小的執行單元。

main() 方法也叫主方法。

方法必須先定義,然後才能呼叫。

方法的定義要寫在 main() 的外面,類的裡面。main() 也是方法,方法不能巢狀定義。

方法的編寫順序和執行順序無關,執行順序要根據呼叫順序來看。

方法名遵循駝峰法。

方法與方法之間是平級關係,不能巢狀定義。誰在前誰在後無所謂,但是為了程式的可讀性,一般都是將 main() 方法放在第一個,表示程式的主入口。

不帶返回值的方法,不要寫 return 語句,如果寫也行,但是隻能是單獨的一條 return 語句,後面不能跟別的內容,即 return;

方法的定義的格式:

public static 返回值型別 方法名(引數) {
    方法體;
    return 返回值;
}

最簡單的方法的定義和呼叫:

public class method1 {
    public static void main(String[] args) {
        greet();
    }

    public static void greet (){
        System.out.println("Hello");
        System.out.println("Good morning");
        System.out.println("Good day");
    }
}

執行結果:

Hello
Good morning
Good day

程式示例:

public class method1 {
    public static void main(String[] args) {
        System.out.println("m");
        method1();
        System.out.println("n");
        method2();
        System.out.println("k");
    }

    public static void method1() {
        System.out.println("a");
        System.out.println("b");
        method2();
        System.out.println("u");
    }

    public static void method2() {
        System.out.println("d");
        System.out.println("c");
    }
}

執行結果:

m
a
b
d
c
u
n
d
c
k

程式示例:

public class method1 {
    public static void main(String[] args) {
        getSum();
    }

    public static void getSum() {
        int a = 10;
        int b = 20;
        System.out.println(a + b);
    }
}

執行結果:

30

帶引數的方法:

形參:形式引數,是方法定義中所用引數。

實參:實際引數,是方法呼叫中所用引數。

實參的個數必須和形參保持一致。

程式示例:

public class method1 {
    public static void main(String[] args) {
        getSum(10, 20);
    }

    public static void getSum(int a, int b) {
        System.out.println(a + b);
    }
}

執行結果:

30

傳遞引數允許自動型別轉換,例如下面的程式涉及將 float 轉換為 double 以及將 int 轉換為 double。

public class method1 {
    public static void main(String[] args) {
        System.out.println(getSum(10.0F, 20));
    }

    public static double getSum(double a, double b) {
        return a + b;
    }
}

執行結果:

30.0

程式示例:

// 計算長方形的面積
import java.util.Scanner;

public class method1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("輸入長方形的長:");
        int length = sc.nextInt();
        System.out.print("輸入長方形的寬:");
        int weight = sc.nextInt();
        System.out.println("長方形的面積為" + getArea(length, weight));
    }

    public static int getArea(int a, int b) {
        return a * b;
    }
}

執行結果:

輸入長方形的長:3
輸入長方形的寬:4
長方形的面積為12

帶返回值的方法:

直接呼叫,不對返回值做任何處理:

方法名(實參);

賦值呼叫:

資料型別 變數 = 方法名(實參);

輸出呼叫:

System.out.println(方法名(實參));

程式示例:

public class method1 {
    public static void main(String[] args) {
        System.out.println(getSum(10, 20));
    }

    public static int getSum(int a, int b) {
        return a + b;
    }
}

執行結果:

30

方法返回型別和實際 return 的計算結果的型別不同時,允許自動型別轉換,即 return 的結果自動型別轉換到方法定義中的指定型別,最終的返回值的型別以方法定義中指定的型別為準。

例如,下面的程式中,return 語句的結果為 int 型別,但是方法定義指定了返回型別為 double 型別,最終方法返回的型別為 double,因為將 int 自動轉換為 double 了。

// 計算長方形的面積

import java.util.Scanner;

public class method1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("輸入長方形的長:");
        int length = sc.nextInt();
        System.out.print("輸入長方形的寬:");
        int weight = sc.nextInt();
        System.out.println("長方形的面積為" + getArea(length, weight));
    }

    public static double getArea(int a, int b) {
        return a * b;
    }
}

執行結果:

輸入長方形的長:3
輸入長方形的寬:4
長方形的面積為12.0

方法的過載

方法的過載:在同一個類中,定義了多個同名的方法,功能都相同或類似,但是形參列表不同,可以是型別不同或者是個數不同或者順序不同,只要有一個不同就可以。

方法的過載與返回值無關。

構成過載的方法必須是同一個類中的,不同的類中的同名方法不構成過載。

不建議書寫僅有形參順序不同的過載函式。

程式示例:

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

public class method1 {
    public static void main(String[] args) {
        byte m1 = 1, n1 = 2;
        System.out.println(compare(m1, n1));
        short m2 = 1, n2 = 2;
        System.out.println(compare(m2, n2));
        int m3 = 1, n3 = 2;
        System.out.println(compare(m3, n3));
        long m4 = 1, n4 = 2;
        System.out.println(compare(m4, n4));
    }

    public static boolean compare(byte a, byte b) {
        System.out.println("呼叫byte型別方法");
        return a == b;
    }

    public static boolean compare(short a, short b) {
        System.out.println("呼叫short型別方法");
        return a == b;
    }

    public static boolean compare(int a, int b) {
        System.out.println("呼叫int型別方法");
        return a == b;
    }

    public static boolean compare(long a, long b) {
        System.out.println("呼叫long型別方法");
        return a == b;
    }
}

執行結果:

呼叫byte型別方法
false
呼叫short型別方法
false
呼叫int型別方法
false
呼叫long型別方法
false

程式示例:

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

public class Exercise1 {
    public static void main(String[] args) {
        int[] nums = {11, 22, 33, 44, 55};
        traverse(nums);
    }

    public static void traverse(int[] strings) {
        System.out.print("[");
        for (int i = 0; i < strings.length; i++) {
            if (i == strings.length - 1)
                System.out.print(strings[i]);
            else System.out.print(strings[i] + ", ");
        }
        System.out.println("]");
    }
}

執行結果:

[11, 22, 33, 44, 55]

程式示例:

// 需求:設計一個方法求陣列的最大值,並將最大值返回

public class Exercise1 {
    public static void main(String[] args) {
        int[] nums = {11, 22, 33, 44, 55};
        System.out.println("陣列最大值為 " + getMax(nums));
    }

    public static int getMax(int[] arr) {
        int max = arr[0];
        for (int i = 0; i < arr.length; i++) {
            max = max > arr[i] ? max : arr[i];
        }
        return max;
    }
}

執行結果:

陣列最大值為 55

程式示例:

// 定義一個方法判斷陣列中的某一個數是否存在,將結果返回

import java.util.Scanner;

public class Exercise1 {
    public static void main(String[] args) {
        int[] nums = {11, 22, 33, 44, 55};
        Scanner sc = new Scanner(System.in);
        System.out.print("輸入要尋找的數:");
        int find = sc.nextInt();
        System.out.println("要尋找的數的索引為:" + getIndex(nums, find));
    }

    public static int getIndex(int[] arr, int n) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == n)
                return i;
        }
        return -1;
    }
}

執行結果:

輸入要尋找的數:22
要尋找的數的索引為:1

程式示例:

// 需求:
// 功能:
// 定義一個方法 copyOfRange(int[] arr, int from, int to)
// 將陣列 arr 中從索引 from(包含 from)開始,
// 到索引 to 結束(不包含to)的元素複製到新陣列中,
// 將新陣列返回。

import java.util.Scanner;

public class Exercise1 {
    public static void main(String[] args) {
        int[] nums = {0, 11, 22, 33, 44, 55, 66, 77, 88, 99};
        Scanner sc = new Scanner(System.in);
        System.out.print("輸入要複製的起始索引:");
        int start = sc.nextInt();
        System.out.print("輸入要複製的終止索引:");
        int end = sc.nextInt();
        int[] newNums = copyOfRange(nums, start, end);
        System.out.println("複製出來的陣列為:");
        for (int i = 0; i < newNums.length; i++) {
            System.out.print(newNums[i] + "  ");
        }
    }

    public static int[] copyOfRange(int[] arr, int from, int to) {
        int[] newArr = new int[to - from + 1];
        for (int i = 0, j = from; i < newArr.length; i++, j++) {
            newArr[i] = arr[j];
        }
        return newArr;
    }
}

執行結果:

輸入要複製的起始索引:1
輸入要複製的終止索引:6
複製出來的陣列為:
11  22  33  44  55  66 

相關文章