所以我认为Java是按值传递的,但为什么会出现以下代码:
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<Integer>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
phase1(numbers);
for (Integer number: numbers) {
System.out.println("number = " + number);
}
}
static void phase1(List<Integer> numbers) {
numbers.remove(0);
}
打印以下内容?
number = 2
number = 3
答案 0 :(得分:2)
所以我认为Java是按值传递的
是。
...但为什么以下代码...打印以下内容?
因为为引用类型传递的值是引用,而不是对象的副本。
“按引用传递”是指完全不同的东西,将引用传递给变量。 Java没有。
如果Java有引用传递,那么这会改变你的方法:
static void phase1(List<Integer> &numbers) {
// Pass-by-reference indicator --^--- that Java doesn't actually have
numbers = new ArrayList<Integer>()
}
...会让您的代码根本不打印任何数字。但事实并非如此,所以事实并非如此。
将对象引用视为int
或long
,它唯一地标识内存中其他位置的对象。 (基本上就是这样。)正如a = b
int
s 将 b
的值复制到a
中一样,{{1}即使值是对象引用,也将 {/ em> {{1>}的值复制到a = b
。被复制的值是引用,而不是它引用的对象。