首頁  >  文章  >  Java  >  Java方法使用實例分析

Java方法使用實例分析

PHPz
PHPz轉載
2023-04-19 16:52:06626瀏覽

一、方法的概念及其使用

1.1、什麼是方法

方法就是一個程式碼片段. 類似 C 語言中的 「函數」。作用如下:

1. 是能夠模組化的組織代碼(當代碼規模比較複雜的時候).

2. 做到代碼被重複使用, 一份代碼可以在多個位置使用.

3. 讓程式碼更好理解更簡單.

4. 直接呼叫現有方法開發, 不必重複造輪子.

1.2、方法的定義

定義格式:

Java方法使用實例分析

範例:寫入函數實作求多少項的階乘的和

public class TeseDemo220424 {
//    计算某一个数的阶乘
    public static int func(int n){
        int ret = 1;
        for(int i = 1;i <= n;i++){
            ret *= i;
        }
        return ret;
    }
//    计算前多少项阶乘之和
    public static int func1(int k){
        int sum = 0;
        for(int i = 1;i <= k;i++){
            sum += func(i);
        }
        return sum;
    }
    public static void main(String[] args) {
//        写函数来求阶乘之和
        Scanner myscanner = new Scanner(System.in);
        System.out.println("请输入你想要求取前多少项的阶乘的和:");
        int num = myscanner.nextInt();
        int sum = func1(num);
        System.out.println("前 " + num + "项的阶乘和为" + sum);
    }
}

注意:

1. 修飾符:現階段直接使用public static 固定搭配(因為main方法是public static ,所以在裡面呼叫的也只能是靜態的方法)。

2. 傳回值類型:如果方法有回傳值,回傳值型別必須與傳回的實體型別一致,如果沒有回傳值,必須寫成void。

3. 方法名稱:採用小駝峰命名。

4. 參數清單:如果方法沒有參數,()中什麼都不寫,如果有參數,需指定參數類型,多個參數之間使用逗號隔開。

5. 方法體:方法內部要執行的語句。

6. 在java當中,方法必須寫在類別當中。

7. 在java當中,方法不能嵌套定義。

8. 在java當中,沒有方法宣告一說。 (宣告與定義不區分)

1.3、方法呼叫的執行過程

呼叫過程:

呼叫方法—>傳遞參數—>找到方法位址—>執行被調方法的方法體—>被調方法結束回傳—>回到主調方法繼續往下執行

形象圖示:

Java方法使用實例分析

#注意:

1,定義方法的時候, 不會執行方法的程式碼. 只有呼叫的時候才會執行.

2,一個方法可以被多次調用.

1.4、實參和形參的關係(重要)

對於形參與實參的關係,大家肯定不陌生,那就是形參是實參的一份臨時拷貝,也就是說形參的改變不會影響到實參。

具體原因圖示:(因為具體牽涉到函數棧幀的問題比較複雜,這裡就給大家簡略的解釋下)

Java方法使用實例分析

所以,由圖可以知道,傳值調用的話,形參與實參的值根本就不是儲存在同一個空間,所以而這不會相互幹擾,在C語言中,如果你希望形參的改變能夠影響到實參,那就必須是傳址調用,但是在Java裡面沒有傳址這種說法,解決方法只能是利用引用(具體後面會詳細介紹)。

二、方法的重載

2.1、為什麼需要方法重載

public class TestDemo220426 {
    public static int addInt(int x,int y){
        return x + y;
    }
    public static double addDouble(double x,double y){
        return x + y;
    }
    public static void main(String[] args) {
        int a = 10;
        int b = 10;
        int ret = addInt(a,b);

        double c = 11.1;
        double d = 12.1;
        double ret1 = addDouble(c,d);
    }
}

看這段程式碼,addint,adddouble這兩個方法,目的都是為了求兩個數的和,但是你得定義兩個不同的函數,函數名不同,但往往有時候取名字又是一件頭疼的事,所以既然方法的本質功能都是一樣的,只是可能參數不同,那我們能不能都用同一個函數名呢?

答案是肯定的,而這種就叫做方法的重載。

2.2、方法重載的定義

在Java中,如果多個方法的名字相同,參數清單不同,則稱該幾種方法被重載了。也就是一個名字但卻有不同的涵義。

public class TestDemo220426 {
    public static int add(int x,int y){
        return x + y;
    }
    public static double add(double x,double y){
        return x + y;
    }
    public static void main(String[] args) {
        int a = 10;
        int b = 10;
        int ret = add(a,b);
        System.out.println(ret);
        double c = 11.1;
        double d = 12.1;
        double ret1 = add(c,d);
        System.out.println(ret1);
    }
}

程式運行截圖:

Java方法使用實例分析

由上面的程式可以看出,都是實作相加的功能,但是定義的是兩個不同的函數實現,只是函數名一樣,這就是函數重載。編譯器會根據你傳入的參數的不同去呼叫對應的函數。

注意:

1. 方法名稱必須相同。

2. 參數清單必須不同(參數的個數不同、參數的類型不同、類型的次序必須不同)(需要以參數來區分)

3. 與傳回值類型是否相同無關

4. 無法定義僅以傳回值區分的兩個函數,這樣不能構成重載

5. 編譯器在編譯程式碼時,會對實參型別進行推演,根據推演的結果來決定要呼叫哪個方法

2.3、方法簽章

方法簽章即:經過編譯器編譯修改過之後方法最終的名字。具體方式:方法全路徑名 參數清單 傳回值類型,構成方法完整的名字。用來區分重載的函數

如何可以查看到我們的方法簽名:

1. 先對工程進行編譯生成.class字節碼檔

#2.在控制台中進入到要查看的.class所在的目錄

3. 輸入:javap -v 字節碼文件名字即可

#三、遞歸

3.1、遞歸的概念

定義:一個方法在執行過程中呼叫自身, 就稱為"遞歸。

遞歸的必要條件:

1. 遞歸的公式。

2. 遞歸的終止條件。

3.2、递归过程分析

    public static  int func(int num){
        if(num == 1){
            return 1;
        }
        return num*func(num - 1);
    }
    public static void main(String[] args) {
//        递归求阶乘
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入一个数:");
        int num = scan.nextInt();
        int ret = func(num);
        System.out.println("阶乘为:" + ret);
    }
}

在这里我们以求一个数的阶乘的代码为例来分析一个递归的过程:

Java方法使用實例分析

递归的过程其实不复杂,看成两个部分,一个是递出去,而是归回来,上面的蓝色箭头是递的过程,红色箭头是归的过程。

3.3、递归小练习

  • 按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)

public class TestDemo220427 {
    public static void myprint(int num){
        if(num < 10){
            System.out.println(num%10);
            return;
        }
        myprint(num/10);
        System.out.println(num%10);
        return;
    }
    public static void main(String[] args) {
//        递归实现按顺序打印数字的每一位
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入一个数:");
        int num = scan.nextInt();
        myprint(num);
    }
}
  • 求斐波那契数列的第 N 项

public class TestDemo220428 {
    public static int fib1(int n){
        int f1 = 1;
        int f2 = 1;
        int f3 = 1;
        for(int i = 3;i <= n;i++){
            f3 = f1 + f2;
            f1 = f2;
            f2 = f3;
        }
        return f3;
    }
    public static int fib(int n){
        if(n == 1 || n == 2){
            return 1;
        }
        return fib(n-1) + fib(n-2);
    }
    public static void main(String[] args) {
//        递归求斐波那契数列的第n项
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入您想要求取的项数:");
        int n = scan.nextInt();
        int ret = fib1(n);
        System.out.println("第" + n + "项为:" + ret);
    }
}

利用递归求斐波那契数列的第n项的话,其实是一个双路递归,不推荐这种求解的方法,因为会算很多重复的项,效率很低,一般都是选择循环迭代的方式来生成斐波那契数即可。

Java方法使用實例分析

以上是Java方法使用實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除