在我遇到这段代码之前,我以为我理解了变量范围:
private static void someMethod(int i, Account a) {
i++;
a.deposit(5);
a = new Account(80);
}
int score = 10;
Account account = new Account(100);
someMethod(score, account);
System.out.println(score); // prints 10
System.out.println(account.balance); // prints 105!!!
编辑:我理解为什么a =新帐户(80)不会做任何事情,但我对a.deposit(5)实际工作感到困惑,因为a只是传入的原始帐户的副本... < / p>
答案 0 :(得分:6)
变量a
是中传递的引用的副本,因此它仍具有相同的值并引用与{{1}相同的Account
对象变量(也就是说,直到你重新分配account
)。当您进行存款时,您仍在使用对外部范围中仍然引用的原始对象的引用。
答案 1 :(得分:3)
您可能需要时间阅读有关pass-by-value in Java的更多信息。
答案 2 :(得分:0)
可能要说清楚,所有通过值传递的变量意味着被调用的方法只获取参数的值而不是这些对象的引用(指针),因此对方法体中这些对象的任何修改都不会t影响外部物体。与c ++不同,c ++可以选择通过引用传递对象,其中方法获取实际对象而不是它的值,因此方法体中的任何修改都会影响外部对象.Java没有通过引用传递。
答案 3 :(得分:-1)
在java中,变量按值传递。