我不明白Java是如何通过价值传递的

时间:2015-06-23 18:06:45

标签: java pass-by-reference pass-by-value

所以我认为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

1 个答案:

答案 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>()
}

...会让您的代码根本不打印任何数字。但事实并非如此,所以事实并非如此。

将对象引用视为intlong,它唯一地标识内存中其他位置的对象。 (基本上就是这样。)正如a = b int s b的值复制到a中一样,{{1}即使值是对象引用,也将 {/ em> {{1>}的复制到a = b。被复制的值是引用,而不是它引用的对象。