"Java是pass-by-value
"
-Java语言规范
然而,有些事情让我感到困惑。请看一眼我的例子
public class Main {
public static void main(String[] args) {
StringBuilder myBuilder = new StringBuilder("Michael");
editString(myBuilder);
System.out.println(myBuilder);
}
public static void editString(StringBuilder x){
x.append(" Ardan");
}
}
输出:
Michael Ardan
这个例子:
public class Main {
public static void main(String[] args) {
int myInt = 10;
editInt(myInt);
System.out.println(myInt);
}
public static void editInt(int x){
x ++;
}
}
输出:
10
我试着阅读了其他文章,它们都说Java总是pass-by-value
。我做了一些测试场景。比较这两个例子,我认为Java的对象是pass-by-reference
,基元类型是pass-by-value
。但是,如果您尝试将int
基元类型替换为Integer
对象,结果将是相同的。如果有人在这里解释这两个例子,我会很高兴的。
严格来说,Java是通过值传递的。
然而,通过值传递的是指向对象的"指针"。因此,您将能够从调用的方法内部访问和修改该对象的状态(这些更改对拥有指向同一对象的"指针"的其他所有人都可见)。
传递引用意味着您可以更改调用端变量指向的位置。这在Java中是做不到的。
例如
public static void editString(StringBuilder x){
x = new StringBuilder("Foo");
}
在方法之外没有任何效果。在传递引用中,实际上是将新的StringBuilder重新分配到调用方法变量中。
你是对的,java对象总是通过引用传递,但是,你可以看到包装类的源代码,如"Integer"、"String"、"Short"等。它们是"value",被定义为final。它不能更改。所以,问题是"如果你试图将int基元类型替换为Integer object,结果会是一样的。"当您替换为Integer Object并更改方法中的值时。对象发生变化。所以,你可以看到结果。