Java值传递和引用传递
1.Java到底是值传递还是引用传递呢?
对于java中的值传递和引用传递一直颇受争论,《Core Java》的作者,以及JAVA的创造者James Gosling都认为当一个对象或引用类型变量被当作参数传递时,也是值传递,这个值就是对象的引用,因此JAVA中只有值传递,没有引用传递。还有一种说法是引用可以看作是对象的别名,当对象被当作参数传递给方法时,传递的是对象的引用,因此是引用传递。而《Thinking in Java》一书的作者Bruce Eckel则站在了中立的立场上。
2.值传递和引用传递的区别
1.值传递:传递的是值的拷贝。也就是说传递后就不互相关了。
2.引用传递:传递的是值的引用。是内存空间的地址。也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。
示例1:
package cn.com.example; /** * Created by Jack on 2017/1/17. */ public class Test { public static void change(int a) { a = 50; } public static void main(String[] args) { int a = 10; System.out.println(a); change(a); System.out.println(a); } }
运行结果:
10 10
内存分析:
示例2:
package cn.com.example; /** * Created by Jack on 2017/1/17. */ public class Test { public static void change(int[] a) { a[0] = 50; } public static void main(String[] args) { int[] a = {10, 20}; System.out.println(a[0]); change(a); System.out.println(a[0]); } }
结果:
10 50
内存分析:
示例3:
package cn.com.example; /** * Created by Jack on 2017/1/17. */ public class Test { public static void change(Emp emp) { emp.age = 50; emp = new Emp();//再创建一个对象 emp.age = 100; } public static void main(String[] args) { Emp emp = new Emp(); emp.age = 100; System.out.println(emp.age); change(emp); System.out.println(emp.age); System.out.println(emp.age); } } class Emp { public int age; }
结果:
100 50 50
内存分析:
示例4:
package cn.com.example; /** * Created by Jack on 2017/1/17. */ public class Test { public static void change(String s) { s = "zhangsan"; } public static void main(String[] args) { String s = new String("lisi"); System.out.println(s); change(s); System.out.println(s); } }
结果:
lisi lisi
由于String类是final修饰的,不可变,它会在内存中在开辟一块新空间