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

来源:互联网 发布:哪里有淘宝号买 编辑:程序博客网 时间:2024/05/17 02:49

有人说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是不变的。