1

在我的程序中,我将一个数组传递给一个名为 setArray() 的方法。但我仍然从数组中获得 0 值。

class Test{
    void setArray(int arr[]){
        Scanner in=new Scanner(System.in);
        int size;
        System.out.print("\nEnter the size : ");
        size=in.nextInt();
        arr=new int[size];
        System.out.print("\nEnter the elements one by one : ");
        for(int i=0;i<size;i++){
            arr[i]=in.nextInt();
        }
    }   
    void create(){
        int a[]={0};
        setArray(a);
        System.out.print("output : ");
        for(int i=0;i<a.length;i++){
            System.out.println(a[i]);
        }   
    }

    public static void main(String[] args)throws IOException{
        Test t=new Test();
        t.create(); 

    }
}

输入尺寸:4

一一输入元素:1 2 3 4

输出:0

4

7 回答 7

1

数组引用是按值传递的,这意味着如果您更改引用指向的内容(使用通过 赋值=),它不会更改您传递给函数的数组的内容,因为原始数组引用仍将指向原始数组内容。该分配仅更改了原始参考的副本所指向的内容。

但是,您的代码可以通过简单地从函数返回数组来轻松修复:

int[] getArray(){        
    Scanner in=new Scanner(System.in);
    int size;
    System.out.print("\nEnter the size : ");
    size=in.nextInt();
    int[]arr=new int[size];
    System.out.print("\nEnter the elements one by one : ");
    for(int i=0;i<size;i++){
        arr[i]=in.nextInt();
    }
    return arr;
}

或者,如果您事先知道数组的大小,您可以通过按值传递的数组引用访问它们来更改数组内容。下面是一个函数示例,它将以对函数调用者可见的方式修改数组:

void setValue(int[]arr, int pos, int val) {
    arr[pos] = val;
}

所以你的代码中的问题是你arr=new int[size];在你的函数内部调用。

于 2013-10-14T09:57:22.813 回答
0

进行到一半时setArray,您将arr用一个全新的数组替换参数的值,然后您将在其中设置值。但旧数组仍然存在 - 它不再被参数引用arr。但是,旧数组仍然被变量ain引用create- 所以它是您最终打印出来的那个。

于 2013-10-14T09:58:14.597 回答
0

那是因为当您说 arr = new int[size] 时,您不再使用原始参考。如果您在退出 setArray 方法之前打印数组,则可以检查它:在内部它是创建的,但在外部您的旧引用没有更改。

于 2013-10-14T09:58:17.723 回答
0

Java 只支持按值传递参数。您不能在 setArray 范围之外更改 arr 所引用的内容。您也可以返回新创建的数组。

于 2013-10-14T09:58:40.883 回答
0

这是证明 Java 是“按值传递”而不是“按引用传递”的经典示例。:)

您传递给 setArray 方法的是 reference 的副本a

此副本指向在方法 setArray 中创建的新对象。但是原始引用仍然指向旧对象。

您需要返回在方法 setArray 中创建的新对象,或者首先对其进行初始化,然后将其传递给方法,以便引用的副本也指向同一个对象并且您的更改会得到反映。

于 2013-10-14T10:00:45.750 回答
0

您只是发送按值传递给 setArray(..) 方法的原始类型值。在 setArray 中添加 return 语句或将数组类型更改为 Integer。希望有帮助。

于 2013-10-14T10:04:13.190 回答
0

这是错误,您存储在 arr[] 中的值未设置为原始 a[]。所以只需将数组 arr[] 变为 a[] 通过将setArray()方法的返回类型更改为 int[] 并更改行,

setArray(a);

a=setArray(a);

class Test{
    int[] setArray(int arr[]){
        Scanner in=new Scanner(System.in);
        int size;
        System.out.print("\nEnter the size : ");
        size=in.nextInt();
        arr=new int[size];
        System.out.print("\nEnter the elements one by one : ");
        for(int i=0;i<size;i++){
            arr[i]=in.nextInt();
        }
    }   
    void create(){
        int a[]={0};
        a=setArray(a);
        System.out.print("output : ");
        for(int i=0;i<a.length;i++){
            System.out.println(a[i]);
        }   
    }

    public static void main(String[] args)throws IOException{
        Test t=new Test();
        t.create(); 

    }
}
于 2013-10-14T10:25:05.380 回答