java 中变量的存储与引用
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
学好计算机,走遍天下都不怕