java中只有值傳遞 為什麼這麼說?兩個例子: public class Student { int sage = 20; String sname = "雲胡不歸"; public static void change(Student s1) { s1.sname = "荀一"; s1.sage ...
java中只有值傳遞
為什麼這麼說?兩個例子:
public class Student {
int sage = 20;
String sname = "雲胡不歸";
public static void change(Student s1) {
s1.sname = "荀一";
s1.sage = 30;
System.out.println("-----------------------------------------------------------------");
System.out.println("change方法內 s1存儲的堆空間地址 = " + s1);
System.out.println("修改時 s1.sname = " + s1.sname + " and s1.sage = " + s1.sage);
System.out.println("-----------------------------------------------------------------");
}
public static void main(String[] args) {
Student s = new Student();//此處的s是引用類型 實在棧空間開闢的一塊空間,存儲一個堆空內的地址 假設s指向堆空間的第一個Student對象
System.out.println("main方法內 s存儲的堆空間地址 = " + s);
System.out.println("創建時 s.sname = " + s.sname + " and s.sage = " + s.sage);
change(s);//值傳遞的含義在於 將 s存儲的地址複製一份 傳入函數,使得函數內的形參s1存儲地址和s相同 此時s1和s同時指向第一個Student對象
System.out.println("修改後 s.sname = " + s.sname + " and s.sage = " + s.sage);
}
}
//列印結果:
main方法內 s存儲的堆空間地址 = com.iweb.test.Student@1b6d3586
創建時 s.sname = 雲胡不歸 and s.sage = 20
-----------------------------------------------------------------
change方法內 s1存儲的堆空間地址 = com.iweb.test.Student@1b6d3586
修改時 s1.sname = 荀一 and s1.sage = 30
-----------------------------------------------------------------
修改後 s.sname = 荀一 and s.sage = 30
//上述列印結果的含義:在棧空間有兩塊空間存儲著一模一樣的堆記憶體地址 無論修改哪一個都會影響它們指向的Student對象的屬性
//當然現在無法證明 棧空間是不是的確有兩塊空間存儲著一模一樣的堆記憶體地址 抑或是 只有一塊棧記憶體,s1和s一起在用,因此引入下一個例子
在change方法中再加上一句s1 = new Student();
public class Student {
int sage = 20;
String sname = "雲胡不歸";
public static void change(Student s1) {
s1 = new Student();//使得棧空間s1存儲一個新的堆記憶體地址 指向一個新的Student對象
s1.sname = "荀一";
s1.sage = 30;
System.out.println("-----------------------------------------------------------------");
System.out.println("change方法內 s1存儲的堆空間地址 = " + s1);
System.out.println("修改時 s1.sname = " + s1.sname + " and s1.sage = " + s1.sage);
System.out.println("-----------------------------------------------------------------");
}
public static void main(String[] args) {
Student s = new Student();//此處的s是引用類型 實在棧空間開闢的一塊空間,存儲一個堆空內的地址 假設s指向堆空間的第一個Student對象
System.out.println("main方法內 s存儲的堆空間地址 = " + s);
System.out.println("創建時 s.sname = " + s.sname + " and s.sage = " + s.sage);
change(s);//值傳遞的含義在於 將 s存儲的地址複製一份 傳入函數,使得函數內的形參s1存儲地址和s相同 此時s1和s同時指向第一個Student對象
System.out.println("修改後 s.sname = " + s.sname + " and s.sage = " + s.sage);
}
}
//列印結果:
main方法內 s存儲的堆空間地址 = com.iweb.test.Student@1b6d3586
創建時 s.sname = 雲胡不歸 and s.sage = 20
-----------------------------------------------------------------
change方法內 s1存儲的堆空間地址 = com.iweb.test.Student@4554617c
修改時 s1.sname = 荀一 and s1.sage = 30
-----------------------------------------------------------------
修改後 s.sname = 雲胡不歸 and s.sage = 20
//修改了棧空間內s1中存儲的地址後對s沒有任何影響 由此可見 s1和s在棧空間內占據兩塊獨立的空間
以上兩個例子可以得出 引用類型傳入change()方法的方式是值傳遞,是將地址複製了一份作為change()的參數
如果是引用傳遞 則 s1 和 s 應該是同一片棧空間 s1 = new Student()
後,相當於也進行了 s = new Student()
的操作 change(s)調用後,對象的屬性依舊會被修改