Java-将列表传递给作为传递引用的方法

时间:2015-04-19 06:06:21

标签: java

stackoverflow中有很多关于按值传递和通过引用传递的讨论。但是我想知道以下场景中发生了什么? 这个页面说java是按值传递的。 Is Java "pass-by-reference" or "pass-by-value"?

如果是以下代码,则从removeElement方法中删除该元素,当我打印列表时,它将从列表中删除第5个元素。

public class Load {
    public static void main(String[] args) {


        ArrayList<Integer> list = new ArrayList<Integer>();
        list.addAll(Arrays.asList(1,1,2,3,5,5,13,21));
        removeElement(list);
        System.out.println(list);
    }
        public static void removeElement(List<Integer> list){
            list.remove(5);//removes element at index 5
        }
}

该计划的输出为[1, 1, 2, 3, 5, 13, 21]

有人可以解释这是如何通过值传递而不是通过引用传递?

3 个答案:

答案 0 :(得分:5)

Java总是按值传递。类型Object的任何变量的值实际上是一个引用。这就是为什么,例如,==被称为参考比较,您需要使用.equals()来比较Object(s)。

答案 1 :(得分:3)

如果是原语,则纯粹是pass by value,如果是Objects,则为pass by value of the reference

当您将list从main方法传递给方法removeElement()作为参数时,会创建另一个(副本)引用,该引用指向同一个List实例。从任一引用所做的任何更改都将反映在同一实际实例上。但是,如果将一个引用分配给某个新Object,则另一个引用仍将指向同一个原始实例。

答案 2 :(得分:1)

虽然这个问题(再次)要求&#34;传值和#34;之间的区别。和#34;传递差异&#34;,我认为存在一种潜在的误解,导致如此多的混乱。必须解决这个问题:

事实上,方法调用按值传递所有参数。正如Erwin Bolwidt在评论中指出的那样,有两种类型:

  • 原始类型
  • 参考类型

JLS (§4)声明:

  

Java编程语言是一种静态类型语言,这意味着每个变量和每个表达式都具有在编译时已知的类型。
  [...]
  Java编程语言中有两种类型:基本类型(§4.2)和引用类型(§4.3)。

当谈到&#34;按值传递&#34;时,意味着当用作方法调用的参数时,变量的内容按值传递。并且引用类型变量的内容是引用。它不是变量引用的对象。这是一个巨大的差异。

在您的示例中,变量list的内容作为值传递给方法removeElement。此是列表对象的引用

这进一步意味着方法removeElement现在可以访问该列表对象(通过其引用)并可以对其进行操作,例如删除元素。但它无法访问调用该方法的变量的内容。因此,它无法更改list方法中变量main的内容(使用&#34;传递参考&#34;)。