1. 程式人生 > >討論java中呼叫函式,形參的傳遞是值傳遞還是引用傳遞的問題

討論java中呼叫函式,形參的傳遞是值傳遞還是引用傳遞的問題

首先說結論:

當引數是引用資料型別時,傳入形參的是實參的引用;(證一)

當引數是基本資料型別時,傳入形參的是實參值;(證二)

證明如下:

(證一)

public class PassByReferenceOrValueTest {
	public static void main(String[] args) {
		Person p = new Person();
		p.setName("main");
		System.out.println("main中hash值:"+p);
		System.out.println("被function呼叫前的name:"+p.getName());
		function1(p);
		System.out.println("被function呼叫後的name:"+p.getName());
	}
	
	public static void function1(Person person) {
		System.out.println("function中的hash值:"+person);
		person.setName("function");
	}
}

 執行結果為:

main中hash值:[email protected]
被function呼叫前的name:main
function中的hash值:[email protected]
被function呼叫後的name:function

 

分析:

在函式中使用的setName方法,將引數的name更改為function之後,實參的name也被改為了function,說明形參的改變會影響到實參,這可以說明傳入的是物件的地址值(至少效果上跟引用傳遞是一樣的)

 

========================================分割線===========================================================

證二:

public class PassByReferenceOrValueTest2 {
    public static void main(String[] args) {
        int i = 1;
        function1(i);
        System.out.println(i);
    }
    
    public static void function1(int i) {
        i=8;
    }
}

執行結果為:

1

 

分析:

雖然呼叫函式時將形參的值設定成8,但是主函式中的i還是1,說明傳入的引數無論怎麼改變,也不會影響到之前的變數i,這跟值傳遞是一樣的效果。