函数不会改变java中变量的值?

时间:2015-08-30 05:52:30

标签: java variables static

我知道java中的所有内容都是按值传递的,但不应该是下面的代码打印2而不是1。

我正在做的就是传递Integer并改变它的价值。为什么打印1而不是2?

public static Integer x;

public static void doChange(Integer x) {
    x = 2;
}

public static void main(String arg[]) {
    x = 1;
    doChange(x);
    System.out.println(x);
}

6 个答案:

答案 0 :(得分:3)

非常感谢你的回答。我想我现在知道幕后发生了什么。我认为我无法看到主函数的变化的原因是因为整数是不可变的,当我为它分配新值时,它创建新对象并分配给引用x;

如果我们可以用可变数据重复相同的例子,我们会看到不同的输出。

public static StringBuilder x;

public static void doChange(StringBuilder x)

{

    x.append("world");

}

public static void main(String arg[]) {
    x = new StringBuilder("hello ");

    doChange(x);

    System.out.println(x);
}

输出:hello world

答案 1 :(得分:1)

盒装movie();仍然是不可变的,int 中的x是指参数,而不是字段。要显示正在进行的操作,请参阅明确的代码版本。

doChange

答案 2 :(得分:0)

你回答了自己的问题:)。

由于它通过值传递,doChange()方法将具有值的副本。所以无论它在该方法中做什么,它都不会影响实际的" x"在main方法中声明的变量。

答案 3 :(得分:0)

您正在传递一个对象,Integer为doChange函数。在doChange()内部,您正在分配一个新值,而Java是自动装箱,即创建一个值为2的新Integer对象并使您的参数指向它。

指向对象的变量基本上是指向内存地址的指针:请参阅以下答案:https://stackoverflow.com/a/1750197/2698109https://stackoverflow.com/a/1750141/2698109

 public static Integer x; // an primitive Object

 // passing an object
 public static void doChange(Integer x) { 
    // under the hood Java is doing this
    x = new Integer(2);
 } 

将方法签名更改为

public static void doChange(int x) {

它应该按预期工作。

答案 4 :(得分:0)

这是您在代码中解决问题的方法。我组成了一个名为La的班级。请注意La.x = 2;方法中的doChange()语句。

public class La {

    public static Integer x;

    public static void doChange(Integer x) {
        La.x = 2;
    }

    public static void main(String arg[]) {
        x = 1;
        doChange(x);
        System.out.println(x);
    }
}

答案 5 :(得分:0)

您更改了参数,而不是类变量。重命名您的参数,它将起作用:

public static void doChange(Integer unused)
{
    x = 2;
}

原因是通过赋值(=)您更改了实例。您的参数x被分配给一个新实例(不是您通过方法调用给它的实例)。解决方案是调用实例方法来更改实例的状态。但: 标量的对象类不像其他类一样工作。 的实例是唯一的(不可变的),您无法更改Integer实例的状态。

但是,如果你像MyNumber一样尝试使用自己的类并使用实例方法调用(不是赋值=),它将按预期工作:

public class MyNumber {
    private int number = 0;
    public set(int v) {
        number = v;
    }
    public get() {
        return number;
    }
    public String toString() {
        return Integer.toString(number);
    }
}

如果您使用MyNumber而不是Integer,请将方法更改为:

public static void doChange(MyNumber x)
{
    x.set(2);
}

当然,将声明更改为:

public static MyNumber x;

...并且主要的第一个作业是:

x.set(1);

希望有助于理解。