问题
可能重复:Java是"传递引用"吗?
数组在Java中不是aprimitive type,但是它们是are not objects either,它们是通过值还是通过引用传递的?它取决于数组包含的内容,例如引用还是基本类型?
#1 热门回答(162 赞)
Everything in Java are passed-by value.
.在Array(它只是一个Object)的情况下,数组引用按值传递..(就像通过值传递对象引用一样)..
将数组传递给其他方法时,实际上会复制对该数组的引用。
- 通过该引用对数组内容的任何更改都将影响原始数组。
- 但是将引用更改为指向新数组不会更改原始方法中的现有引用。
看到这篇文章..
Is Java "pass-by-reference" or "pass-by-value"?
**参见此工作示例: - **
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..
}
#2 热门回答(72 赞)
你的问题基于错误的前提。
数组在Java中不是原始类型,但它们也不是对象......"
实际上,Java中的所有数组都是objects1。每个Java数组类型都有java.lang.Object
作为其超类型,并继承了Object
API中所有方法的实现。
与所有Java对象一样,数组按值传递......但该值是对数组的引用。
通过引用进行实际传递涉及传递变量的地址,以便可以更新变量。这不是在Java中传递数组时发生的情况。
以下是一些解释"pass-by-reference"和"pass-by-value"之间区别的链接:
- http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/topic/com.ibm.xlcpp8a.doc/language/ref/cplr233.htm
- http://www.cs.fsu.edu/~myers/c /notes/references.html
相关问题:
- Java是"通过引用传递"还是"按值传递"?
历史背景:
短语"pass-by-reference"最初是"引用调用",它用于区分FORTRAN(通过引用调用)的语义与ALGOL-60(按值调用)的语义区分。并按名称呼叫)。
- 在按值调用时,将参数表达式计算为值,并将该值复制到被调用的方法。
- 在引用调用中,参数表达式被部分地计算为传递给调用方法的"左值"(即变量或数组元素的地址)。然后,调用方法可以直接读取和更新变量/元素。
- 在按名称调用时,实际的参数表达式被传递给调用方法(!!),它可以多次评估它(!!!)。这实现起来很复杂,可以使用(滥用)来编写非常难以理解的代码。呼叫名称只在Algol-60中使用过(谢天谢地!)。
更新
实际上,Algol-60的call-by-name类似于将lambda表达式作为参数传递。皱纹是这些不完全lambda表达式(它们在实现级别被称为"thunk")可以直接修改调用过程/函数中范围内的变量的状态。这是使他们如此难以理解的部分原因。 (例如,参见维基百科页面7008001897。)
1.链接的问答(Arrays in Java and how they are stored in memory)中没有任何内容表明或暗示数组不是对象。
#3 热门回答(55 赞)
数组实际上是对象,所以传递了一个引用(引用本身是通过值传递的,但却被混淆了?)。快速举例:
// 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;
}
如果传递非空列表,则在方法返回时它不会为空。