我一直在阅读这个主题: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
提前谢谢。
答案 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