iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
自我挑戰組

前端工程師的java學習紀錄系列 第 14

Day14-參數與遞迴

  • 分享至 

  • xImage
  •  

Java中的參數記憶體儲存方式

當參數是基本數據型別時,會直接將值賦值給參數,而當值為引用數據型別時,賦值的為位址值,所以在使用時要注意。

基本數據型別程式碼:

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;
}

流程:

  1. 一開始宣告addNum 方法,參數是int 型別的num
  2. addNum 內使用num++參數num +1。
  3. 實例化 NumberTest class 。(PersonTest person = new PersonTest();
  4. main 中宣告int 型別的num120
  5. 調用NumberTest 中的方法addNum 並將num 作為參數傳遞近去。
  6. 💡當進行第5個步驟時,實際上已經將值賦值給參數num ,這時候在main 中的num 已經跟addNum 中的num 無關。
  7. 所以當調用addNum 時會印出121 ,這是在addNum 中的System.out.println 方法。
  8. 接著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;
}

流程:

  1. 宣告一個Person class ,當中有String型別的name以及int型別的age
  2. main實例化 PersonTesttest
  3. main實例化 Personperson,並且賦值age20
  4. 調用test中的addAge方法,並將person帶入參數中。
  5. 印出後會發現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();
}

💡 雖然遞迴不用設定循環終止的條件,但是要在當中朝著目標前進。

假設想計算某個自然數到另一個自然數的和,且第二個自然數需要大於第一個自然數,並且每次都+1的情況

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

💡要特別注意,遞迴的效能比循環還差,所以能夠使用循環的情況下,已使用循環為優先。


上一篇
Day13-class method的重載與參數
下一篇
Day15-package、import
系列文
前端工程師的java學習紀錄38
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言