java中的引數傳遞 值傳遞,引用傳遞
引數是按值而不是按引用傳遞的說明 Java 應用程式有且僅有的一種引數傳遞機制,即按值傳遞。
在 Java 應用程式中永遠不會傳遞物件,而只傳遞物件引用。因此是按引用傳遞物件。Java 應用程式按引用傳遞物件這一事實並不意味著 Java 應用程式按引用傳遞引數。引數可以是物件引用,而 Java 應用程式是按值傳遞物件引用的。
Java 應用程式中的變數可以為以下兩種型別之一:引用型別或基本型別。當作為引數傳遞給一個方法時,處理這兩種型別的方式是相同的。兩種型別都是按值傳遞的;沒有一種按引用傳遞。
按值傳遞和按引用傳遞。按值傳遞意味著當將一個引數傳遞給一個函式時,函式接收的是原始值的一個副本。因此,如果函式修改了該引數,僅改變副本,而原始值保持不變。按引用傳遞意味著當將一個引數傳遞給一個函式時,函式接收的是原始值的記憶體地址,而不是值的副本。因此,如果函式修改了該引數,呼叫程式碼中的原始值也隨之改變。
1、物件是按引用傳遞的
2、Java 應用程式有且僅有的一種引數傳遞機制,即按值傳遞
3、按值傳遞意味著當將一個引數傳遞給一個函式時,函式接收的是原始值的一個副本
4、按引用傳遞意味著當將一個引數傳遞給一個函式時,函式接收的是原始值的記憶體地址,而不是值的副本
首先考試大來看看第一點:物件是按引用傳遞的
確實,這一點我想大家沒有任何疑問,例如:
class Test01{
public static void main(String[] args){
StringBuffer s= new StringBuffer(“good”);
StringBuffer s2=s;
s2.append(” afternoon.”);
System.out.println(s);
}
}
物件s和s2指向的是記憶體中的同一個地址因此指向的也是同一個物件。
如何解釋“物件是按引用傳遞的”的呢?
這裡的意思是進行物件賦值操作是傳遞的是物件的引用,因此物件是按引用傳遞的,有問題嗎?
程式執行的輸出是:
good afternoon.
這說明s2和s是同一個物件。
這裡有一點要澄清的是,這裡的傳物件其實也是傳值,因為物件就是一個指標,這個賦值是指標之間的賦值,因此在java中就將它說成了傳引用。(引用是什麼?不就是地址嗎?地址是什麼,不過就是一個整數值)
再看看下面的例子:
class Test02{
public static void main(String[] args){
int i=5;
int i2=i;
i2=6;
System.out.println(i);
}
}
程式的結果是什麼?5!!!
這說明什麼,原始資料型別是按值傳遞的,這個按值傳遞也是指的是進行賦值時的行為下一個問題:Java 應用程式有且僅有的一種引數傳遞機制,即按值傳遞
class Test03{
public static void main(String[] args){
StringBuffer s= new StringBuffer(“good”);
StringBuffer s2=new StringBuffer(“bad”);
test(s,s2);
System.out.println(s);//9
System.out.println(s2);//10
}
static void test(StringBuffer s,StringBuffer s2) {
System.out.println(s);//1
System.out.println(s2);//2
s2=s;//3
s=new StringBuffer(“new”);//4
System.out.println(s);//5
System.out.println(s2);//6
s.append(“hah”);//7
s2.append(“hah”);//8
}
}
程式的輸出是:
good
bad
new
good
goodhah
bad
考試大提示: 為什麼輸出是這樣的?
這裡需要強調的是“引數傳遞機制”,它是與賦值語句時的傳遞機制的不同。
我們看到1,2處的輸出與我們的預計是完全匹配的
3將s2指向s,4將s指向一個新的物件
因此5的輸出列印的是新建立的物件的內容,而6列印的原來的s的內容
7和8兩個地方修改物件內容,但是9和10的輸出為什麼是那樣的呢?
Java 應用程式有且僅有的一種引數傳遞機制,即按值傳遞。
在這裡畫了一個圖給大家分析:
1.物件就是傳引用
2.原始型別就是傳值
3.String型別因為沒有提供自身修改的函式,每次操作都是新生成一個String物件,所以要特殊對待。可以認為是傳值。
參考:http://www.cnblogs.com/perfy/archive/2012/10/16/2726039.html