“Java是pass-by-value
”
- Java Language Specification
然而,有些事情让我感到困惑。请瞥一眼我的例子
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
对象,则结果将是相同的。如果有人在这里解释这两个例子我会很高兴。
答案 0 :(得分:3)
严格地说,Java 是传递值。
然而,通过值传递的是对象的“指针”。因此,您将能够从被调用方法内部访问和修改该对象的状态(并且这些更改对于具有指向同一对象的“指针”的所有其他人都可见。)
传递引用意味着您可以更改主叫方变量指向的位置。你不能用Java做的。
例如
public static void editString(StringBuilder x){
x = new StringBuilder("Foo");
}
在方法之外没有任何影响。在pass-by-reference中,您实际上会将新的StringBuilder分配回调用方法变量。
答案 1 :(得分:-2)
你是对的,java对象总是按引用传递,但是,你可以看到包装类的源代码,如'Integer','String','Short'等等。它们的'价值'是定义的因为最终.it无法改变。所以,问题是“如果你试图将int原语类型替换为Integer Object,结果将是相同的。”当它替换为整数对象并更改方法中的值时,它与它有关。对象发生了变化。所以,你可以看到结果。