我不明白 Java 是如何按值传递的

I don't understand how Java is 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

So I thought Java was pass by value

是。

...but why does the following code...print the following?

因为为引用类型传递的是引用,而不是对象的副本。

"Pass by reference" 指的是一个 完全不同的东西 ,传递对 变量 的引用。 Java 没有。

如果 Java 有传递引用,那么对您的方法进行此更改:

static void phase1(List<Integer> &numbers) {
// Pass-by-reference indicator --^--- that Java doesn't actually have
    numbers = new ArrayList<Integer>()
}

...将使您的代码根本不打印任何数字。但是没有,所以没有。

将对象引用视为 intlong,它唯一标识内存中其他地方的对象。 (基本上就是这样。)正如 a = bint b 的值复制到 a,所以a = b copy bvaluea 中,即使值是一个对象引用。被复制的值是引用,而不是它引用的对象。