4

我正在使用三个对象:StringBuilderIntegertestobject- 传递给方法以更改其状态。

正如预期的那样,StringBuilderandtestobject指向同一个对象,并且状态发生了变化,但它不适用于Integer对象。

class testobject{
    int x = 1;
}

public class test{
    public static void main(String[] args){
        StringBuilder s1 = new StringBuilder("String");
        go(s1);
        System.out.println(s1);

        Integer s2 = new Integer("20");
        go1(s2);
        System.out.println(s2);

        testobject s3 = new testobject();
        go2(s3);
        System.out.println(s3.x);
    }

    static void go(StringBuilder s1){
        s1.append("Builder");
    }

    static void go1(Integer s2){
        s2 = 1;
    }
    static void go2(testobject s3){
        s3.x = 5;
    }

结果:

StringBuilder
20
5

预期结果:

StringBuilder
1
5
4

2 回答 2

9

看看你的三种方法:

static void go(StringBuilder s1){
    s1.append("Builder");
}

static void go1(Integer s2){
    s2 = 1;
}

static void go2(testobject s3){
    s3.x = 5;
}

goandgo2中,您正在修改参数值所引用的对象。

go1中,您正在更改参数变量本身的值。这是非常不同的,因为Java 总是使用 pass-by-value,所以调用者看不到这种变化。

了解对象根本不传递给方法很重要。相反,引用是。和s1的值都是引用。如果你把变量想象成一张纸,每张纸上都有一个房子地址,它是从.s2s3main

go和的方法体go2就像参观地址在纸上的房子,并在前门上涂漆。如果您随后使用原始纸片参观房屋,您仍然会在前门上看到新的颜色。

的方法体go1就像把写在纸上的地址潦草地写下来,然后在上面写一个新的地址。这不会改变房子,也不会改变原来的纸。

于 2013-10-04T16:46:26.743 回答
-1

如果您要传递的参数是对象而不是原始类型,那么 Java 将按对象传递视为按值传递,因为 Java 支持按值传递的概念。

这里 a 和 p 是相同的参考:

public class ObjPass {
    int value;
    public static void main(String[] args) {
        ObjPass p = new ObjPass();
        p.value = 5;
        System.out.println("Before calling: " + p.value);
        increment(p);
        System.out.println("After calling: " + p.value);       
    }
    public static void increment(ObjPass a){
        a.value++;

    }

}

输出:

Before calling: 5
After calling: 6        
于 2014-01-24T22:19:49.600 回答