java交換兩個變量的值
1.幼兒園版
package tst; public class Test { public static void main(String[] args) { String x = "xx"; String y = "yy"; exchange(x, y); System.out.println(); System.out.println(x+"<->"+y); } private static void exchange(String a, String b) { String temp = a; a = b; b = temp; System.err.println(a+"<->"+b); System.err.println(); } }
顯然,這個是錯的
就從這個版本說起
1.java里方法的參數傳遞方式只有一種:值傳遞,就是將實際參數值的副本(復制品)傳入方法內,而參數本身不會受到任何影響.
(是不是覺得自己已經明白為什么上面的程序是錯誤的了)
2.main方法中調用exchange方法時,main方法還未結束,因此main和exchange分配了兩個展區.
所以實際上真正交換的只是exchange棧區中的,而main棧取中的沒有改變
再看一個正確的版本
package tst; public class Test2 { public static void main(String[] args) { PeopleName pname = new PeopleName(); pname.firstname = "first"; pname.lastname = "last"; swap(pname); System.err.println(pname.toString()); } private static void swap(PeopleName p) { String temp = p.firstname; p.firstname = p.lastname; p.lastname = temp; System.out.println(p); } } class PeopleName { public String firstname; public String lastname; @Override public String toString() { return "PeopleName [firstname=" + firstname + ", lastname=" + lastname + "]"; } }
創建一個對象時,內存中有兩個實體:堆內存中保存了對象本身,棧里面存的是該對象的引用,
沒有調用swap之前是這樣的
調用時
由於值傳遞,swap的行慘也是一個指向堆的引用,這樣他就可以操作堆,
這樣就明白了吧
拓展
對象的復制
peopleName p1 = new peopleName();
p1.firstname = "qq";
p1.lastname = "ww";
peopleName p2 = p1;
p1.firstname = "ee";
此時P1,P2的firstname屬性都是"ee",原因同上
最后一個很常用的情景,就是從resutlset取對象,這個對象應該在循環外面初始化,還是在循環里面初始ua的問題,答案是在里面(提示用new的初始化會分配內存)
原因同上
1.方法的傳遞機制
升級版面試題
http://www.2cto.com/kf/201607/528019.html