关于JAVA 参数传递理解

来源:互联网 发布:stc15f2k单片机下载线 编辑:程序博客网 时间:2024/06/06 15:03
</pre><p>总结一下java参数传递几种情况给自己 有不对的地方 请指正 :)</p><p></p><p>------------- 情况1 --------------</p><pre name="code" class="java">
public class Pass {


    static void add(int n){
        ++n;
    }


    public static void main(String[] args){
        int n = 1;
        add(n);
        System.out.println(n);
    }

}

由于JAVA 是值传递 也就是说会传递参数的一份拷贝 所以虽然在add方法内部n的值变化了 但是变化的只是n

的副本, 打印出来的n的值还是1


--------------- 情况 2 -----------------

public class Pass {


    int i;
    Pass(){
        i = 2;
    }


    void add(int n){
        i += n;
    }


    public static void main(String[] args){
        Pass p = new Pass();
        p.add(2);
        System.out.println(p.i);
    }
}

这里 由于i作为Pass类的成员变量 当p调用add方法时,p引用指向的堆中的i 已经发生变化 这时候i的值为 4


---------------- 情况 3 ----------------

public class Pass {


    int i;


    Pass(){
        i = 2;
    }


    public void setI(Pass p){
        p.i++;
    }


    public static void main(String[] args){
        Pass p = new Pass();
        p.setI(p);
        System.out.println(p.i);
    }
}

这里setI参数 传地的是p的引用副本 都指向一块实际的内存区域。i的值会变化成3


-------------- 情况4 ------------------

public class Pass {


    int i;


    Pass(){
        i = 2;
    }


    public void setI(Pass p){
        Pass p2 = new Pass();
        p = p2;
    }


    public static void main(String[] args){
        Pass p = new Pass();
        p.setI(p);
        System.out.println(p.i);
    }
}

这种情况下 在setI方法内新产生了一个Pass引用p2和一块儿新的内存区域 此时副本p指向p2 所以没有变化 将打印2


---------------- 情况5 -------------------

public class Pass {


    public static void setArr(int[] arr){
        arr[0] = 1;
    }


    public static void main(String[] args){
        int[] arr = new int[10];
        for(int i:arr){
            i = 0;
        }


        setArr(arr);
        System.out.println(arr[0]);
    }
}


这种情况和上面情况差不多 也是传递的是数组引用的拷贝 这样会改变数组第一个值 会打印1



0 0
原创粉丝点击