java中的傳值和傳引用的說法其實只是仿照了C/C++的說法,事實上,java中傳的都是值,如下例:
public class Test {
public static void main(String[] args) {
Test t = new Test();
A a1 = new A(3);
change(a1);
System.out.println(a1.getId());
int a= 45;
change(a);
System.out.println(a);
}
static class A {
int id;
public A(int id) {
this.id = id;
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return this.id;
}
}
public static void change(A a){
a = new A(5);
System.out.println("a: " + a);
}
public static void change(int a){
a = 5;
}
}
此程序的輸出結果是:3和45;
很顯然,第一次調用的change(a1)時,傳入的並非是a1本身,而只是a1所指向的地址的值,而在函數裏面的a = new A(5);並沒有改變a1本身所指向的地址值,所以,最後還是輸出了3;第二次調用chenge(a)時,就更容易理解了,此時傳入的就是5這個值,並不是a本身,從而a的值最終都沒有變化,當然輸出45。
由上可以很簡單的認爲,java中沒有所謂的傳引用一說,說到底都是傳值,區別在於:
1、當傳入的是對象時,所謂的“值”變成了該對象在堆上的“地址值”,如傳入對象a1,則此值是:a1的地址值;
2、當傳入的是原生變量如:int,long等變量時,則所謂的“值”是該變量的“內容”,如:a=5,就是傳入的5。