先看下网上关于值传递和引用传递的概念
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址,在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。
先不管值传递还是引用传递,直接来看例子
eg(1)
public class Test1 { public static void main(String[] args) { Person a = new Person(23, "a" ); Person b = new Person(22, "b" ); System.out.println( "改变前a:" + a + " b:" + b); changeValue(a, b); System.out.println( "改变后a:" + a + " b:" + b); } private static void changeValue(Person a, Person b) { a.setAge( 10 ); b.setAge( 11 ); } }
输出
改变前a:Person [age=23] b:Person [age=22] 改变后a:Person [age=10] b:Person [age=11]
理解内存图
eg(2)
public class Test1 { public static void main(String[] args) { Person a = new Person(23, "a" ); Person b = new Person(22, "b" ); System.out.println( "改变前a:" + a + " b:" + b); changeValue(a, b); System.out.println( "改变后a:" + a + " b:" + b); } private static void changeValue(Person a, Person b) { Person temp = a; a = b; b = temp; } }
输出
改变前a:Person [age=23 ] b:Person [age =22 ] 改变后a:Person [age =23 ] b:Person [age =22]
理解内存图