无法更新数组的内容

时间:2013-10-14 09:52:23

标签: java arrays

在我的程序中,我将一个数组传递给一个名为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

7 个答案:

答案 0 :(得分: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];

答案 1 :(得分:0)

setArray的中途,你用一个全新的数组替换参数arr的值,然后你将其设置为。但旧的数组仍然存在 - 它只是不存在由参数arr引用。但是,旧数组仍由a中的变量create引用 - 因此它是您最终打印出来的那个。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

您传递给setArray方法的内容是引用a的副本。

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

这是错误,您在arr []中存储的值未设置为原始a []。 所以只需将数组arr []变为[],方法是将 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(); 

    }
}