物件導向:方法的重載與參數的值傳遞
尚硅谷JavaSE筆記-09

細說方法

方法的重載(overload)

  • 定義:同一各類中,允許存在一個以上的同名方法,只要他們的參數個數或參數類型不同即可
  • 跟方法的權限修飾符、返回值類型、形參變量名、方法體無關,判斷重點在於參數本身
  • 可能會自動類型提升,舉例:傳入的是int形,方法中沒有int但有double,就會調用double
  • 典型的例子就是內建的println()

可變個數形參

  • 格式:方法名(形參類型 ... 形參名)
  • 調用時傳入的形參數量可以是0到多個,包含數組
  • 與本類中方法名相同,形參不同的方法間構成重載(可共存)
  • 與本類中方法名相同,形參類型也相同的數組之間不構成重載(不可共存)
    • PS.這是歷史遺留問題,因為可變個數形參是JDK5加入的,以前都是用數組
  • 方法內把它當作數組使用,遍歷itar (i=0;i<形參名.length;i++){}
  • 必須聲明在末尾,且最多只能有一個

方法參數的值傳遞

先複習一下變量的賦值規則

  • 變量是基本數據類型(byte、short、int、long、char、float、double、boolean),賦值的是變量所保存的數據值
  • 變量是引用類型(引用類型就只有null跟地址值兩種情況),賦值給的是所保存數據的地址值

名詞解釋

  • 形參:方法定義時,聲明的小括號中的參數
  • 實參:方法調用時,實際傳給形參的數據

傳參規則

跟變量的賦值規則其實相同

  • 如果參數是基本數據類型,實參賦給形參的是數據值(類似給一份副本)
  • 如果參數是引用類型,實參賦給形參的是地址值(包含變量的數據類型)

陷阱題

printlnchar[]這有個特例,要避免踩坑就是調用時多看看方法格式

int[] arr1 = new int[]{1, 2, 3};
System.out.println(arr1); // [I@1b6d3586
char[] arr2 = new char[]{'a', 'b', 'c'};
System.out.println(arr2); // abc

練習-在方法中引用其他類的方法並調用

public class Main {
    public static void main(String[] args) {
        PassObject t1 = new PassObject();
        Circle c = new Circle();
        t1.printAreas(c, 5);
        System.out.println(c.radius);
    }
}

class Circle {
    double radius;

    public double findArea() {
        return Math.PI * radius * radius;
    }
}

class PassObject {
    public void printAreas(Circle c, int t) {
        System.out.println("Radius\t\tArea");
        for (int i = 1; i <= t; i++) {
            c.radius = i;
            System.out.println(c.radius + "\t\t" + c.findArea());
        }
        c.radius = t + 1;
    }
}

遞歸方法

方法中調用自己達成類似for的效果,但注意必須能收斂

求1到n之和

public int getSum(int n) {
    if (n == 1) {
        return 1;
    } else {
        return n + getSum(n - 1);
    }
}

求某已知數列

已知數列f(0)=1, f(1)=4, f(n+2)=2*f(n+1)+f(n),求f(10)=?

public int f(int n) {
    if (n == 0) {
        return 1;
    } else if (n == 1) {
        return 4;
    } else {
        return 2 * f(n - 1) + f(n - 2);
    }
}
  • 重點在不能寫f(n+2)=2*f(n+1)+f(n),寫+2就死龜了,要左右都-2

上次修改於 2021-11-24