如何理解JAVA 参数传递总是值传递(pass-by-value )

有人说java 参数传递在对primitive类型的参数传递时候是值传递,对对象参数的传递是引用传递。

可是JAVA规范里面却说的是总是值传递。

看看这个图就理解了。

如何理解JAVA 参数传递总是值传递(pass-by-value )_第1张图片

对传入的参数总是有个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是不变的。

你可能感兴趣的:(value)