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]
。
有人可以解释这是如何通过值传递而不是通过引用传递?
答案 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;)。