方法的過載、可變形參的方法、方法的引數值傳遞機制、遞迴方法

ssINT發表於2020-12-28

 


一、方法的過載

  • 定義:在同一個類中,允許存在一個或以上的同名方法,只要它們的引數個數或者引數型別不同即可.

"兩同一不同" : 同一個類、相同方法名

                      引數列表不同,引數個數不同,引數型別不同

  • 舉例:

            Arrays類中過載的sort() / binarySearch()

  • 判斷是否是過載:

跟方法的許可權修飾符、返回值型別、形參變數名、方法體都沒有關係!

  • 在通過物件呼叫方法時,如何確定某一個指定的方法:

方法名-------->引數列表

package day06;

public class Demo {

	public static void main(String[] args) {
		Demo demo = new Demo();
		demo.getSum(1, 2);
	}
	
	//如下的4個方法構成了過載
	public void getSum(int i, int j) {
		System.out.println("方法一");
	}

	public void getSum(double d1, double d2) {
		System.out.println("方法二");
	}

	public void getSum(String s, int i) {
		System.out.println("方法三");
	}

	public void getSum(int i, String s) {
		System.out.println("方法四");
	}

}

二、可變形參的方法

  • JDK 5.0新增的內容

  • 具體使用:
  1. 可變個數形參的格式: 資料型別 ... 變數名
  2. 當呼叫可變個數形參的方法時,傳入的引數個數可以是"0個,1個,2個,....
  3. 可變個數形參的方法與本類中方法名相同,形參不同的方法之間構成過載
  4. 可變個數形參的方法與本類中方法名相同,形參型別也相同的陣列之間不構成過載-----二者之間不能共存
  5. 可變個數形參在方法的形參中,必須宣告在末尾 
package day06;

/*可變個數形參的方法
 * 
 * 1.JDK 5.0新增的內容
 * 2.具體使用:
 * 	2.1   可變個數形參的格式: 資料型別 ... 變數名
 *  2.2 當呼叫可變個數形參的方法時,傳入的引數個數可以是"0個,1個,2個,....
 *  2.3 可變個數形參的方法與本類中方法名相同,形參不同的方法之間構成過載
 *  2.4 可變個數形參的方法與本類中方法名相同,形參型別也相同的陣列之間不構成過載-----二者之間不能共存
 *  2.5 可變個數形參在方法的形參中,必須宣告在末尾 
 *  
 * */

public class Demo {
	
	public static void main(String[] args) {
		
		Demo demo = new Demo();
		demo.show(12);
		demo.show("hello");
		demo.show("hello","hello1","hello2");
		demo.show();
	}
	
	public void show(int i) {
		System.out.println(i);
	}

	public void show(String s) {
			System.out.println(s);
	}

	public void show(String ... str) {
		System.out.println("可變個數形參");
	}
	
//	public void show(String[] str) {
//		System.out.println("可變個數形參");
//	}
	
}

二、變數的值傳遞機制

  • 如果變數是基本資料型別,此時賦值的是變數所儲存是資料值
  • 如果變數是引用資料型別,此時賦值的是變數所儲存的資料的地址值
package day06;

/*
 * 關於變數的賦值:
 * 
 * 如果變數是基本資料型別,此時賦值的是變數所儲存是資料值
 * 如果變數是引用資料型別,此時賦值的是變數所儲存的資料的地址值
 * 
 * */

public class Demo {

	public static void main(String[] args) {

		System.out.println("*********************基本資料型別*********************");
		int m = 10;
		int n = m;
		System.out.println("m =" + m + ",n=" + n);

		n = 20;

		System.out.println("m =" + m + ",n=" + n);

		System.out.println("*********************引用資料型別*********************");

		Order o1 = new Order();
		o1.orderId = 1001;

		Order o2 = o1;//賦值以後,o1和o2的地址值相同,都指向了堆空間中同一個物件實體

		System.out.println("o1.orderId =" + o1.orderId + ",o2.orderId =" + o2.orderId);

		o2.orderId = 1002;

		System.out.println("o1.orderId =" + o1.orderId + ",o2.orderId =" + o2.orderId);
	}
}

class Order {
	int orderId;
}

三、方法的形參的傳遞機制:基本資料型別

  • 如果引數是基本資料型別,此時實參賦給形參的是實參真實儲存的資料值(不是地址值)
package day06;

/*
 * 方法的形參的傳遞機制:基本資料型別
 * 
 * 1.形參: 方法定義時,宣告的小括號內的引數
 * 	   實參: 方法呼叫時,實際傳遞給形參的資料
 * 
 * 2.值傳遞機制:
 * 如果引數是基本資料型別,此時實參賦給形參的是實參真實儲存的資料值(不是地址值)
 * */


public class Demo {

	public static void main(String[] args) {

		// 交換兩個變數的值的操作
		int m = 10;
		int n = 20;
		
		System.out.println("m=" + m + ",n=" + n);
		
		//交換
		//int temp = m;
		//m = n;
		//n= temp;
		
		Demo demo = new Demo();
		demo.swap(m, n);
		
		//並沒有交換成功
		System.out.println("m=" + m + ",n=" + n);
	}
	//錯誤方法
	public void swap(int m,int n) {
		int temp = m;
		m = n;
		n= temp;
	}
}

 

四、方法的形參的傳遞機制:引用資料型別

  • 如果引數是引用資料型別,此時實參賦給形參的是是地址值
package day06;

public class Demo {

	public static void main(String[] args) {

		Data data = new Data();
		
		data.m = 10;
		data.n = 20;

		System.out.println("m=" + data.m + ",n=" + data.n);

		// 交換m和n的值
		// int temp = data.m;
		// data.m = data.n;
		// data.n= temp;

		Demo demo = new Demo();
		demo.swap(data);
		
		System.out.println("m=" + data.m + ",n=" + data.n);

	}
	//成功
	public void swap(Data data) {
		int temp = data.m;
		data.m = data.n;
		data.n = temp;
	}
}

class Data {
	int m;
	int n;
}

五、遞迴方法

  • 遞迴方法:一個方法體內呼叫它自身。
  • 方法遞迴包含了一種隱式的迴圈,它會重複執行某段程式碼,但這種重複執行無須迴圈控制。
  • 遞迴一定要向已知方向遞迴,否則這種遞迴就變成了無窮遞迴,類似於死迴圈。
package day06;

/*
 * 遞迴方法的使用(瞭解)
 * 1.遞迴方法:一個方法體內呼叫它自身
 * 2.方法遞迴包含了一種隱式的迴圈,它會重複執行某段程式碼,但這種重複執行無需迴圈控制.
 * 遞迴一定要向己方向遞迴,否則這種遞迴就變成了無窮遞迴,類似於死迴圈.
 * 
 * 
 * */

public class Demo {
	public static void main(String[] args) {

		// 例1:計算1-100之間所有自然數的和
		// 方式一:
		int sum = 0;
		for (int i = 1; i <= 100; i++) {
			sum += i;
		}

		// 方法二:
		Demo demo = new Demo();
		int sum2 = demo.getSum(100);

		
		System.out.println(sum);
		System.out.println(sum2);

	}
	
	// 例2:計算1-100之間所有自然數的乘積
	public int getSum(int n) {
		if (n == 1) {
			return 1;
		} else {
			return n * getSum(n - 1);
		}
	}
}

 

相關文章