在Java 中,參數傳遞機制有兩種:傳值、傳址。
基本型別作為參數傳遞時,是傳遞值的拷貝,無論你怎麼改變這個拷貝,原值是不會改變的;屬於傳值。
物件作為參數傳遞,是把物件在記憶體中的位址拷貝了一份傳給了參數;屬於傳址。
public static void main(String[] args) { int n =3; // ① System.out.println(n); // 3 chageData(n); // ② System.out.println(n); // 3}public static void chageData(int num){ num = 10; // ③}
觀察輸出結果,發現n 的值並沒有改變。
因為 n,num 都是基本型,所以值就直接保存在變數中。
流程圖如下(對應程式碼中的①②③):
public static void main(String[] args) { String str = "hello"; // ① System.out.println(str); // hello chageData(str); //② System.out.println(str); // hello}public static void chageData(String s){ s ="world"; // ③}###觀察結果,發現str 並沒有改變。這裡結合流程圖來做下分析:############在① 執行完後,就會在堆中產生一個物件引用str,裡面存放的是位址索引,該位址指向記憶體中真正的String 物件############在② 產生了物件引用s ,透過傳址引用,它也得到了「hello」的位址索引。 ############在 ③ 對物件引用 s 重新賦值。照理說應該是物件的值從 “hello” -> “world”。但它卻創造了一個的新的對象,原因就在於 String 的不可變性,因為一旦 String 改變就建立新的物件。 ########################再來看StringBuffer 的例子:###
public static void main(String[] args) { StringBuffer stb = new StringBuffer("hello"); // ① System.out.println(stb); // hello chageData(stb); // ② System.out.println(stb); // hello world}public static void chageData(StringBuffer s){ s.append("world"); // ③} }###觀察結果,發現stb 發生了改變,因為StringBuffer 物件是可變的,改變它的內容不會創造出新的物件############### 以上就是14.Java 基礎- 參數傳遞的內容,更多相關內容請關注PHP中文網(www.php.cn)! ################