物件導向:方法的重載與參數的值傳遞
尚硅谷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跟地址值兩種情況),賦值給的是所保存數據的地址值
名詞解釋
- 形參:方法定義時,聲明的小括號中的參數
- 實參:方法調用時,實際傳給形參的數據
傳參規則
跟變量的賦值規則其實相同
- 如果參數是基本數據類型,實參賦給形參的是數據值(類似給一份副本)
- 如果參數是引用類型,實參賦給形參的是地址值(包含變量的數據類型)
陷阱題
println
在char[]
這有個特例,要避免踩坑就是調用時多看看方法格式
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