天天看點

Java值傳遞方式詳解:方法參數或參數的傳遞java裡面的方法參數

java裡面的方法參數

在程式設計語言裡面,有一些參數傳遞給方法的專業術語:按值調用;引用調用;以前還有的按名調用(Algol就是使用的這種)

其中java使用的就時按值調用:這種方法的特點是隻得到所有參數的拷貝,方法不能修改傳遞給它的任意參數變量的内容

public class Main {

	public static void main( String[] args)
	{
		int num = 1;
		Main.change(num);
		System.out.println("num = " + num);
	}
	public static void change(int n)
	{
		n = 2;
	}
}

           

執行結果:

Java值傳遞方式詳解:方法參數或參數的傳遞java裡面的方法參數

在這裡我們可以看到,num的值并沒有改變,這裡面的執行過程可分為三步:

(1)n被初始化為num的一個拷貝——1

(2)n被修改為2,但是num任然是1,并沒有改變

(3)方法接受後,n不再被使用(被自動回收)

是以,即時對n的值進行了操作讓其改變,但是num的值因為沒有對其做操作,是以num的值并沒有改變

Java值傳遞方式詳解:方法參數或參數的傳遞java裡面的方法參數

在參數傳遞結束拷貝後,結構的草圖相當于上圖的中的第一個,而修改為 “2” 後,相當于變成了第二個,讓“n = 2;”,并不是對num的“1”進行的操作,而是将n的指向改變了,讓其指向了“2”,而num指向的位址裡面的“1”*沒有改變,是以num還是“1”

其實,方法參數共有兩種類型:

(1)基本資料類型(數字、布爾值)

(2)對象引用

上面已經看到了,我們無法對基本資料類型進行修改

但是對象引用就不一樣了,我們可以輕松的對其進行修改

public class Main {

	public static void main( String[] args)
	{
		Test t = new Test();
		change(t);
		System.out.println("t.getNum() = " + t.getNum());
	}
	
	public static void change(Test tt)
	{
		tt.setNum(2);
	}
}

class Test{
	private int num;
	
	public Test()
	{
		num = 1;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}
}
           

執行結果:

Java值傳遞方式詳解:方法參數或參數的傳遞java裡面的方法參數

在這裡我們看到,對象引用輕松的就對num進行了改變

在這裡具體的執行過程也可分為三步:

(1) tt 被初始化為t值的拷貝,這裡是一個對象的引用

(2)setNum的方法應用于這個對象的引用, tt 和 t 同時引用的那個Test對象的num被改變成了2

(3)方法結束,參數 tt 不再使用,被回收

Java值傳遞方式詳解:方法參數或參數的傳遞java裡面的方法參數

t 的指向是Test ,而 tt 是拷貝的 t ,也是指向的Test,在對 tt 進行修改時,setNum是修改其指向的位址的修改,即setNum之前,結構的草圖如上圖的第一個圖,修改之後,是上圖的第二個圖,這樣,就實作了對一個資料的修改

總結

實作一個改變對象參數狀态的方法:隻要方法得到的是對象引用的拷貝,對象引用及其他的拷貝同時引用同一個對象

在java中,或許有人會認為java的對象采用的是引用調用(雖然上文已說明,java全部都是按值傳遞),下面是一個推翻對象是引用調用的例子:

對變量執行交換方法,為什麼值沒有交換?

這個連結是我寫的兩個變量交換,值為什麼沒有改變的例子,可以充分的解釋,為什麼對象不是按值調用而是按值傳遞

java中方法參數的使用情況:

  • 一個方法不能修改一個基本類型的參數(數值型或布爾型)
  • 一個方法可以改變一個對象參數的狀态
  • 一個方法不能讓對象參數引用一個新的對象