数组是通过值传递还是通过Java中的引用传递?

可能重复:
Java是否“通过引用”?

数组在Java中不是原始类型,但它们也不是对象,它们是按值还是按引用传递的? 它取决于数组包含的内容,例如引用或基本类型?


你的问题是基于一个错误的前提。

数组在Java中不是原始类型,但它们不是对象......“

事实上,Java 中的所有数组都是 objects1。 每个Java数组类型都有java.lang.Object作为其超类型,并继承Object API中所有方法的实现。

像所有Java对象一样,数组通过值传递......但值是对数组的引用。

通过引用的真实传递涉及传递变量的地址,以便可以更新变量。 这不是在Java中传递数组时发生的情况。

以下是一些解释“通过引用”和“按价值传递”之间区别的链接:

  • 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
  • 相关SO问题:

  • Java是“通过引用传递”还是“按值传递”?
  • 历史背景:

    “通过引用传递”这个短语原本是“引用引用”,它用来区分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?

    下一篇: Passing Data between View Controllers