问题

可能重复: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作为其超类型,并继承了ObjectAPI中所有方法的实现。

与所有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;
}

如果传递非空列表,则在方法返回时它不会为空。


原文链接