将Integer的引用传递给Java中的方法

时间:2014-02-07 13:39:21

标签: java

我一直在阅读这个主题:Is Java "pass-by-reference" or "pass-by-value"?,我试图从这个答案中运行示例:https://stackoverflow.com/a/73021/2838739。 事实上,myDog的值已在此方法之外进行了更改。 然后我尝试用Integer做同样的事情。我很惊讶,因为它的价值没有改变。有人能解释我为什么吗?

我的测试代码是:

   package testtest;

class Dog {

    String name;

    public Dog(String name) {
        this.name=name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

public class Main {

    public static void main(String[] args) {

        Dog myDog = new Dog("Rover");
        System.out.println(myDog.getName());
        foo(myDog);
        System.out.println(myDog.getName());

        Integer i = 5;
        changeValue(i);
        System.out.println(i);
    }

    public static void changeValue(Integer i) {
        i = 50;
    }
    public static void foo(Dog someDog) {
        someDog.setName("Max");     // AAA
        someDog = new Dog("Fifi");  // BBB
        someDog.setName("Rowlf");   // CCC
    }

}

输出是:

流动站

最高

5

提前谢谢。

3 个答案:

答案 0 :(得分:4)

整数不是一个可变类。 (没有set方法。)您可以将旧变量指向不同的Integer,但这不会更改传递给方法的Integer。

答案 1 :(得分:0)

Integer是一种原始数据类型。你不能在方法中改变它们。

如果将对象传递给方法,则可以更改其可访问的成员变量。

在Java中,有一些特殊的包装类用于基本类型,例如Integer for int,Character for char等,即使它们像对象一样,也无法在方法中更改它们的值。这是我所知道的唯一例外。

答案 2 :(得分:0)

正如所指出的那样,原始类型是按值传递的。但是如果你真的需要通过引用传递基元,你可以使用数组。

public class PassByRefMain {

    public static void main(String[] args) {
        PassByRefMain m = new PassByRefMain();
        int[] number = new int[]{5};
        System.out.println(number[0]);
        m.changevalue(number);
        System.out.println(number[0]);  
    }

    public void changevalue(int [] number){
        number[0] = 9;
    }
}

输出

5
9