我知道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);
}
答案 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/2698109和https://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被分配给一个新实例(不是您通过方法调用给它的实例)。解决方案是调用实例方法来更改实例的状态。但:
标量的对象类不像其他类一样工作。
但是,如果你像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);
希望有助于理解。