数组是通过值传递还是通过Java中的引用传递?
可能重复:
Java是否“通过引用”?
数组在Java中不是原始类型,但它们也不是对象,它们是按值还是按引用传递的? 它取决于数组包含的内容,例如引用或基本类型?
你的问题是基于一个错误的前提。
数组在Java中不是原始类型,但它们不是对象......“
事实上,Java 中的所有数组都是 objects1。 每个Java数组类型都有java.lang.Object
作为其超类型,并继承Object
API中所有方法的实现。
像所有Java对象一样,数组通过值传递......但值是对数组的引用。
通过引用的真实传递涉及传递变量的地址,以便可以更新变量。 这不是在Java中传递数组时发生的情况。
以下是一些解释“通过引用”和“按价值传递”之间区别的链接:
相关SO问题:
历史背景:
“通过引用传递”这个短语原本是“引用引用”,它用来区分FORTRAN(引用引用)和ALGOL-60(通过引用的引用)的参数传递语义和名称)。
在按值调用中,参数表达式被计算为一个值,并且该值被复制到被调用的方法中。
在调用引用中,参数表达式被部分计算为传递给调用方法的“左值”(即变量或数组元素的地址)。 调用方法可以直接读取和更新变量/元素。
在名称调用中,实际参数表达式被传递给调用方法(!!),它可以多次评估它(!!!)。 这实施起来很复杂,可以用来(滥用)编写非常难以理解的代码。 在Algol-60中只有名字叫做(谢天谢地!)。
UPDATE
实际上,Algol-60的名称类似于将lambda表达式作为参数传递。 起皱的是,这些非精确的lambda表达式(它们在实现级别被称为“thunk”)可以间接修改调用过程/函数中范围内的变量的状态。 这是让他们很难理解的部分原因。 (例如,请参阅Jensen设备上的Wikipedia页面。)
1.链接问答中没有任何内容(Java中的数组以及它们如何存储在内存中)或者表明数组不是对象。
Everything in Java are passed-by value.
。 在数组(仅仅是一个对象)的情况下,数组引用通过值传递。(就像对象引用通过值传递一样)。
将数组传递给其他方法时,实际上将复制对该数组的引用。
看到这个帖子..
Java是“通过引用传递”还是“按值传递”?
看到这个工作例子: -
public static void changeContent(int[] arr) {
// If we change the content of arr.
arr[0] = 10; // Will change the content of array in main()
}
public static void changeRef(int[] arr) {
// If we change the reference
arr = new int[2]; // Will not change the array in main()
arr[0] = 15;
}
public static void main(String[] args) {
int [] arr = new int[2];
arr[0] = 4;
arr[1] = 5;
changeContent(arr);
System.out.println(arr[0]); // Will print 10..
changeRef(arr);
System.out.println(arr[0]); // Will still print 10..
// Change the reference doesn't reflect change here..
}
数组实际上是对象,所以通过引用(引用本身是通过值传递的,困惑了吗?)。 快速示例:
// assuming you allocated the list
public void addItem(Integer[] list, int item) {
list[1] = item;
}
您将看到来自调用代码的列表更改。 但是你不能改变引用本身,因为它是按值传递的:
// assuming you allocated the list
public void changeArray(Integer[] list) {
list = null;
}
如果传递一个非空列表,那么在该方法返回时它不会为空。
链接地址: http://www.djcxy.com/p/3497.html上一篇: Are arrays passed by value or passed by reference in Java?