【问题标题】:Concept about pass by reference OR value [duplicate]关于通过引用或值传递的概念[重复]
【发布时间】:2015-01-30 06:48:13
【问题描述】:
public class Foo {
public static void change(int[] arr){
    arr = null;
}
public static void change2(int[] arr){
    arr[0] = 99;
}
public static void main (String[] args){
    int[] arr = {1,2,3,4,5};
    change(arr);
    System.out.println("it should null: "+Arrays.toString(arr));
    change2(arr);
    System.out.println("updated array : "+Arrays.toString(arr));
}   }

控制台输出

it should null: [1, 2, 3, 4, 5]
 updated array: [99, 2, 3, 4, 5]

当我将 int[] 传递给第一种方法时,我需要了解按引用传递,即 change() 它不会使数组为空,根据我的理解,它应该更改为 NULL 作为数组引用通过引用传递,但如果我将数组传递给第二种方法,即 change2() 它会更改特定索引处的值。这意味着正在传递引用。

【问题讨论】:

    标签: java arrays oop parameter-passing pass-by-reference


    【解决方案1】:

    因为java中的Array是对象,而数组引用变量是在public static void change(int[] arr){中按值传递的,所以你不能通过这样做来改变引用变量:-

    arr = null;
    //or
    arr=new int[10];
    

    但是你可以改变数组引用变量的副本指向的对象(即传递给方法的arr):-

    arr[0]=1
    

    【讨论】:

      【解决方案2】:

      这不是通过引用传递。在 Java 中,一切都是按值传递的。传递给该方法的是引用的副本。由于这个新引用也指向(引用)同一个对象,因此您可以使用新引用来操作该对象。

      但是如果你给这个新引用分配一个不同的对象,它不会改变旧引用指向(引用)的对象。旧的引用仍然指向它曾经指向的同一个对象。所以旧的参考没有问题。

      所以输出非常好。

      C# 允许通过 ref。虽然提到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-12
        • 2012-06-03
        • 2012-02-29
        • 2013-11-21
        • 1970-01-01
        • 2013-09-10
        • 1970-01-01
        • 2011-02-24
        相关资源
        最近更新 更多