Java 数组与错误打印

Java 数组与错误打印,java,arrays,println,Java,Arrays,Println,当我运行此代码时,它会打印0、1、2,但我不知道为什么。你能给我解释一下吗 public void run() { int[] arr = new int [3]; for(int i=0; i<arr.length;i++){ arr[i]=i; } domore(arr); for(int i=0; i<arr.length;i++){ println

当我运行此代码时,它会打印0、1、2,但我不知道为什么。你能给我解释一下吗

public void run() {
        int[] arr =  new int [3];
        for(int i=0; i<arr.length;i++){
            arr[i]=i;
        }
        domore(arr);
        for(int i=0; i<arr.length;i++){
            println(arr[i]);
        }
    }

    private void domore(int[] arr) {
        // TODO Auto-generated method stub
        int [] att = new int [3];
        for(int i=0; i<att.length;i++){
            att[i]=77;
        }
        arr=att;
    }

在Java中,对对象的引用是通过值传递的。您在doMore方法中所做的任何更改都不会反映在原始数组中,因为您正在重新分配传递的引用。。。请使用camelCase命名方法/字段。i、 e,使用doMore而不是doMore

public void run() {
        int[] arr =  new int [3];   // arr points to an integer array of size 3
         doMore(arr);
        } 
 private static void doMore(int[] arrNew) {   // arrNew is copy of arr so it  also points to the same integer array of size 3. So, any changes made by arrNew are as good as changes made by arr (and yes data of arr is changed..)        
        // TODO Auto-generated method stub
        int [] arrNew = new int [3];           // you are making arrNew point to new integer array of size 3. So, now arrNew points to a new object and not to the one pointed by arr. 
        for(int i=0; i<arrNew.length;i++){
            arrNew[i]=77;
        }

    }

在方法中,domore int[]arr作为参数传递,这意味着引用的副本通过值传递。在该方法中,将创建一个新的int[],然后将其分配给引用int[]arr的副本。这将永远不会更改在run方法中创建的初始int[]。它只会将传递的参数分配给domore中新创建的数组。

因为您正在将arr数组的引用放入方法domore。在它内部,您通过设置arr=att来剪切此引用。外部方法运行无法识别此新设置的引用,并将保留您的旧数组引用,其中您已将值0、1、2放入其中。

domore是一个无效函数。如果你不想改变你的价值观,你必须返回一些东西

private int[] domore (int[] arr){
int [] att = new int [3];
    for(int i=0; i<att.length;i++){
        att[i]=77;
    }
    return att;
}

尝试在domode方法中返回数组arr

public void run() {
    int[] arr =  new int [3];
    for(int i=0; i<arr.length;i++){
        arr[i]=i;
    }
    arr = domore(arr);
    for(int i=0; i<arr.length;i++){
        println(arr[i]);
    }
}

private int[] domore(int[] arr) {
    // TODO Auto-generated method stub
    int [] att = new int [3];
    for(int i=0; i<att.length;i++){
        att[i]=77;
    }
    return(att);
}

您正在使用一组基本体。如果将int从基本体更改为对象,则不会出现该问题

int a=5;
int b=a;
b=10;
->a仍然是5岁。 如果要使用原语,只需返回int数组并将其分配给初始数组即可

arr=doMore(arr);
使用 arr=int[]att.clone;或者你也可以使用Array.copyOf方法


当您在函数中传递任何参数值时,它的作用域将仅是该函数的局部作用域,而不是arr=att

另一件事是,在java中,您通过值而不是引用调用函数

若要使用修改后的值,必须从函数返回该值

public void run() {
            int[] arr =  new int [3];
            for(int i=0; i<arr.length;i++){
                arr[i]=i;
            }
            // arr is in run() method
            domore(arr);
            for(int i=0; i<arr.length;i++){
                System.out.println(arr[i]);
            }
        }

        private void domore(int[] arr) {
            // TODO Auto-generated method stub
            int [] att = new int [3];
            for(int i=0; i<att.length;i++){
                att[i]=77;
            }
            arr=att; // here scope of arr is local for domore() method only
            // so arr in run() method will not modified.
        }

arr=att时;您只是将引用的本地副本重新分配给数组。Google pass by value vs.pass by-reference.您只需在方法参数arr中设置值,因为外部方法对它有此引用!有写的void,您返回int[]是的,您是对的,我更正了它。但是如果我用doMore方法arr[1]=33写;它将被改变@user3151874,这是因为传递了引用的副本。这意味着对作为参数传递的对象的更改将影响初始引用。但是,将新引用指定给该引用不会影响传递到方法中的引用。请参阅:@user3151874-检查我编辑的答案..这并不能解决问题,因为引用仍将保留包含元素0、1、2的数组@波波。。。我以为他想改变数组的内容。没错!但是如果在domore方法中克隆数组,则对这个问题没有好处。在run方法中,arr变量仍将保存对包含0、1、2的数组的引用。
public void run() {
            int[] arr =  new int [3];
            for(int i=0; i<arr.length;i++){
                arr[i]=i;
            }
            // arr is in run() method
            domore(arr);
            for(int i=0; i<arr.length;i++){
                System.out.println(arr[i]);
            }
        }

        private void domore(int[] arr) {
            // TODO Auto-generated method stub
            int [] att = new int [3];
            for(int i=0; i<att.length;i++){
                att[i]=77;
            }
            arr=att; // here scope of arr is local for domore() method only
            // so arr in run() method will not modified.
        }