有人说java 参数传递在对primitive类型的参数传递时候是值传递,对对象参数的传递是引用传递。
可是JAVA规范里面却说的是总是值传递。
看看这个图就理解了。
对传入的参数总是有个copy的过程。
因为primitive类型的参数在JVM中,参数中存储的就是本身的值,copy后的参数和原来的参数就完全独立了。
对于对象类型的参数,参数中存储的是对象在heap中地址引用,copy后两个参数指向的是同一个地址引用,如果你对地址引用操作,操作的是同一个地方,所以原始的参数的Value也会变。
××如果对象类型的参数传递是在不同的JVM,如EJB调用,情况有会有不同,如果是localhome调用,仍然和上图一样,如果是remotehome,copy后的地址引用自然就和原始的不是一个地方了。
看看这个例子:
public class Car {
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Car(String color) {
super();
this.color = color;
}
public static void second(Car d){
d = new Car("blue");
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
Car c = new Car("red");
second(c);
System.out.println(c.getColor()); //red
}
}
在上面的例子中:
public static void second(Car d){
d = new Car("blue");
}
操作的是d本身,而不是d的引用地址,d改变了,只是把d的引用地址指向了一个新的Car。
所以c是不变的。