传值&传值引用
转自http://www.cnblogs.com/androidsuperman/p/9012320.html
首先对传值和传引用要有个基本的概念
传值:传递的是值的副本。方法中对副本的修改,不会影响到调用方。
传引用:传递的是引用的副本,共用一个内存,会影响到调用方。此时,形参和实参指向同一个内存地址。对引用副本本身(对象地址)的修改,如设置为null,重新指向其他对象,不会影响到调用方。
直接上代码,更好的理解两者的区别。首先看传基本数据类型,如int、long等。
// 基本数据类型 public class ParamChangeValue { public static void main(String[] args) { int s = 1; System.out.println("args = [" + s + "]"); change(s); System.out.println("args = [" + s + "]"); } private static void change(int i){ i = i* 5; } }
输出:
args = [1]
args = [1]
从输出的的结果中可以看到原本的s并没有被修改,即传值传递的是值的副本,不会影响到本身。
再来看传对象。
// 对象 public class ObjectChangeValue { public static class Score{ private int value; public int getValue() { return value; } public void setValue(int value) { this.value = value; } } public static void main(String[] args) { Score score = new Score(); score.setValue(1); System.out.println("args = [" + score.getValue() + "]"); change(score); System.out.println("after args = [" + score.getValue() + "]"); } private static void change(Score score){ score.setValue(2); } }
输出:
args = [1]
after args = [2]
从结果中我们可以看到score实例的value值被修改了,因为传引用后指向的是同一个地址,修改的实际上也就是这个地址上的值,另外要注意一点的是如果对象被重新创建或赋值为null,即new会重新指向其他对象,不影响其原对象的值。
第三部分:传String、Integer等immutable类型。
// String、Integer、Long等 public class StringChangeValue { public static void main(String[] args) { String s = "test1"; System.out.println("args = [" + s + "]"); change(s); System.out.println("args = [" + s + "]"); } private static void change(String i){ i = i + " test value"; } }
只要知道String、Integer类是final类型的就明白输出的结果为什么是这样的。
总结:基本类型(byte,short,int,long,double,float,char,boolean)为传值;对象类型(Object,数组,容器)为传引用;String、Integer、Double等immutable类型因为类的变量设为final属性,无法被修改,只能重新赋值或生成对象。当Integer作为方法参数传递时,对其赋值会导致原有的引用被指向了方法内的栈地址,失去原有的的地址指向,所以对赋值后的Integer做任何操作都不会影响原有值。