stackoverflow中有很多关于按值传递和通过引用传递的讨论.但是我想知道以下场景中发生了什么?这个页面说java是按值传递的.Java是"通过引用传递"还是"传递价值"?.
如果是以下代码,则从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
}
}
Run Code Online (Sandbox Code Playgroud)
该程序的输出是 [1, 1, 2, 3, 5, 13, 21].
有人可以解释这是如何通过价值而不是通过参考传递?
Java总是按值传递.任何类型变量的值Object实际上都是一个引用.这就是为什么,例如,==据说是一个参考比较,你需要.equals()用于比较Object.
如果是原始类型,则纯粹pass by value是Objects它pass by value of the reference。
list从主方法传递到方法removeElement()作为参数时,将创建另一个指向相同List实例的(副本)引用。从这两个引用中进行的任何更改都将反映在同一实际实例上。但是,如果您将一个引用分配给某个新对象,则另一个引用仍将指向相同的原始实例。
尽管这个问题(再次)询问“按值传递”和“按差异传递”之间的区别,但我认为存在潜在的误解,导致如此多的混乱。必须解决这个问题:
\n\n事实上,方法调用按值传递所有参数。正如 Erwin Bolwidt 在他的评论中指出的,有两种类型:
\n\nJLS (\xc2\xa74)指出:
\n\n\n\n\nJava 编程语言是一种静态类型语言,这意味着每个变量和每个表达式都有一个在编译时已知的类型。
\n
\n [...]
\n Java 编程语言中有两种类型:原始类型 ( \xc2\xa74.2 ) 和引用类型 ( \xc2\xa74.3 )。
当谈到“按值传递”时,意味着变量的内容在用作方法调用的参数时按值传递。引用类型变量的内容是引用。它不是变量引用的对象。这是一个巨大的差异。
\n\n在您的示例中,变量的内容list作为值传递给方法removeElement。该值是对列表对象的引用。
这进一步意味着该方法removeElement现在可以访问该列表对象(通过其引用)并可以对其进行操作,例如删除元素。但它无法访问调用该方法的变量的内容。list因此它不能更改方法内变量的内容main(这可以通过“按引用传递”实现)。
| 归档时间: |
|
| 查看次数: |
13295 次 |
| 最近记录: |