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;
}
}
執行結果:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL4gTMxEzMzYTMwEDNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
在這裡我們可以看到,num的值并沒有改變,這裡面的執行過程可分為三步:
(1)n被初始化為num的一個拷貝——1
(2)n被修改為2,但是num任然是1,并沒有改變
(3)方法接受後,n不再被使用(被自動回收)
是以,即時對n的值進行了操作讓其改變,但是num的值因為沒有對其做操作,是以num的值并沒有改變
在參數傳遞結束拷貝後,結構的草圖相當于上圖的中的第一個,而修改為 “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;
}
}
執行結果:
在這裡我們看到,對象引用輕松的就對num進行了改變
在這裡具體的執行過程也可分為三步:
(1) tt 被初始化為t值的拷貝,這裡是一個對象的引用
(2)setNum的方法應用于這個對象的引用, tt 和 t 同時引用的那個Test對象的num被改變成了2
(3)方法結束,參數 tt 不再使用,被回收
t 的指向是Test ,而 tt 是拷貝的 t ,也是指向的Test,在對 tt 進行修改時,setNum是修改其指向的位址的修改,即setNum之前,結構的草圖如上圖的第一個圖,修改之後,是上圖的第二個圖,這樣,就實作了對一個資料的修改
總結
實作一個改變對象參數狀态的方法:隻要方法得到的是對象引用的拷貝,對象引用及其他的拷貝同時引用同一個對象
在java中,或許有人會認為java的對象采用的是引用調用(雖然上文已說明,java全部都是按值傳遞),下面是一個推翻對象是引用調用的例子:
對變量執行交換方法,為什麼值沒有交換?
這個連結是我寫的兩個變量交換,值為什麼沒有改變的例子,可以充分的解釋,為什麼對象不是按值調用而是按值傳遞
java中方法參數的使用情況:
- 一個方法不能修改一個基本類型的參數(數值型或布爾型)
- 一個方法可以改變一個對象參數的狀态
- 一個方法不能讓對象參數引用一個新的對象