java中 引用传递、值传递的理解(数组,自定义类,基本数据类型,String类)

代码部分:

    public static void main(String[] args) {
        testInt();
        testString();
        testArray();
        testX();
    }

    public static void testInt() {
        int a = 1;
        int b = a;
        a = 2;
        System.out.println("b = "+b);
        changeInt(a);
        System.out.println("a = "+a);
    }

    public static void testString() {
        String a = "1";
        String b = a;
        a = "2";
        System.out.println("b = "+b);
        changeString(a);
        System.out.println("a = "+a);
    }

    public static void testArray() {
        int[] a = {1,2,3};
        int[] b = a;
        a[0] = 2;
        System.out.println("b[0] = "+b[0]);
        changeArray(a);
        System.out.println("a[0] = "+a[0]);
    }

    public static void testX() {
        X a = new X("1");
        X b = a;
        a.setValue("2");
        System.out.println("b.value = "+b.getValue());
        changeX(a);
        System.out.println("a.value = "+a.getValue());
    }


    static void changeInt(int a) { a = 100;}

    static void changeString(String a) { a = "100";}

    static void changeArray(int[] a) { a[0] = 100;}

    static void changeX(X a) { a.setValue("100");}

输出结果补充,如下:

b = 1
a = 2
b = 1
a = 2
b[0] = 2
a[0] = 100
b.value = 2
a.value = 100

结果分析:

将数据赋值或当做参数传递的时候:
1,对于基本数据类型,String类, Integer, Double等immutable的类型 都是 值传递;
2,对于数组,其他类等,都是引用传递;

图形表达:

//2018-9-17更新
如果非要谈论是否java里只有值传递,可以把引用传递看成:实际上传递了引用的值。
补充代码与输出如下



public static void testX02() {
    X a = new X("1");
    changeX02(a);
    System.out.println("a.value = "+a.getValue());
    }

static void changeX02(X a) {
    a = new X("");
    a.setValue("100");
}

上方代码输出结果:a.value = 1
也就是说testX02中的a,仍然指向最初定义value为“1”的对象;
当做参数调用changeX02后,只能通过引用去改变对象,不能去改变其指向对象;
所以传递的是引用的复制,也就是上图中的黄色箭头。

posted @ 2018-02-05 19:30  kangkaii  阅读(3444)  评论(0编辑  收藏  举报