當參數是基本數據型別時,會直接將值賦值給參數,而當值為引用數據型別時,賦值的為位址值,所以在使用時要注意。
基本數據型別程式碼:
public class NumberTest {
public static void main(String[] args) {
PersonTest person = new PersonTest();
int num = 120;
addNum(num); // num = 121
System.out.println(num); // 120
}
public void addNum(int num) {
num++
System.out.println("num = " + num)
}
public void addAge(Person person) {
person.age++;
}
}
class Person {
String name;
int age;
}
流程:
addNum 方法,參數是int 型別的num 。addNum 內使用num++ 將參數的num +1。實例化 NumberTest class 。(PersonTest person = new PersonTest();)main 中宣告int 型別的num 為120。NumberTest 中的方法addNum 並將num 作為參數傳遞近去。參數 的num ,這時候在main 中的num 已經跟addNum 中的num 無關。addNum 時會印出121 ,這是在addNum 中的System.out.println 方法。System.out.println(num); 印出的120 則是在main 中的num,並沒有被做任何改動。💡main方法中會有一個num的變數宣告
addNum中也有一個num的變數宣吿(由參數處提供),且在調用時,由於是基本數據型別,所以是直接賦值,而不是位址值。
引用數據型別程式碼:
public class PersonTest {
public static void main(String[] args) {
PersonTest test = new PersonTest();
Person person = new Person();
person.age = 20;
test.addAge(person);
System.out.println(person.age); // 21
}
public void addAge(Person person) {
person.age++;
}
}
class Person {
String name;
int age;
}
流程:
Person class ,當中有String型別的name以及int型別的age。main中實例化 PersonTest為test。main中實例化 Person為 person,並且賦值給age為20。test中的addAge方法,並將person帶入參數中。person.age後,會發現跟第一個範例不同,person.age被改變成21了。addAge(person) → person:位址值 → 找出位址值並將age++。
main方法中 → person:位址值 → 由於是相同位址值,所以印出來時,也是被addAge操作後的值。
💡 方法中的參數對應的會是該參數所對應的值。
指的是在方法中自己調用自己,或者是A方法調用B方法,B方法調用C方法,C方法調用A方法,也屬於遞迴的一種。
調用自己長這樣:
public void a() {
a();
}
被別人調用再調用自己長這樣:
public void a() {
b();
}
public void b() {
c();
}
public void c() {
a();
}
💡 雖然遞迴不用設定循環終止的條件,但是要在當中朝著目標前進。
public int sum(int num1, int num2) {
if(num2 == num1) {
return num1;
}
return num2 + sum(num1, num2-1);
}
假設num1 = 1 , num2 =10
第十次呼叫時,返回 1
第九次呼叫時,返回 2+ sum(1, 1) (1)
第八次呼叫時,返回3 + sum(1, 2) (3)
第七次呼叫時,返回 4+ sum(1, 3) (6)
第六次呼叫時,返回 5+ sum(1, 4) (10)
第五次呼叫時,返回 6+ sum(1, 5) (15)
第四次呼叫時,返回7 + sum(1, 6) (21)
第三次呼叫時,返回8 + sum(1, 7) (28)
第二次呼叫時,返回9 + sum(1, 8) (36)
第一次呼叫時,返回 10 + sum(1, 9) (45)
最後返回55