0

请参阅java.util.Collections.reverse()的文档。

我不明白 Java 方法如何只能按值传递,但允许以下内容:

public static void reverse(List<?> list)

它如何改变通过参数传递的原始对象?特别是当所有通过参数传递的对象都是按值传递的时候?这不应该意味着只传递对象的一个​​副本,因此只能返回一个引用吗?既然我们返回的是 void,我们怎么能改变被传递的原始对象呢?

  • 一个非常困惑的 Java Padawan
4

3 回答 3

9

对列表的引用是按值传递的。

调用者和reverse()方法都引用了同一个列表。

于 2013-04-23T03:33:08.533 回答
2

除了安迪的回答:

您将引用的值传递给列表,并且不能更改原始引用。这是为了证明:

public static void main(String[] args) throws Exception {
    List<Integer> list = Arrays.asList(1, 1, 1);
    test(list);
    System.out.println(list);
}

public static void test(List<?> list) {
    list = Arrays.asList(2,2,2);
}

尽管我们在测试方法中将 [2, 2, 2] 分配给列表,但它仍然打印 [1, 1, 1]

于 2013-04-23T03:48:02.857 回答
0

它如何改变通过参数传递的原始对象?

你传递一个引用,你不能传递一个对象。

特别是当所有通过参数传递的对象都是按值传递的时候?

引用是按值传递的,而不是对象。

这不应该意味着只传递对象的副本吗?

仅传递引用的副本。

因此只能返回一个引用?

引用是唯一没有返回的东西。

既然我们返回的是 void,我们怎么能改变被传递的原始对象呢?

您无法更改参考,但您可以更改参考指向的内容。

于 2013-04-23T05:55:49.317 回答