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修饰的,不可变,它会在内存中在开辟一块新空间