首頁  >  問答  >  主體

关于java的引用传递和值传递

public class TestArray {
public static void main(String[] args) {
    //revise an array directly without return
    String[] test = {"test"};
    voidReturn(test);
    System.out.println(test[0]);
    //revise an array directly with return
    String[] test2 = {"test2"};
    String[] outtest2 = arrayReturn(test2);
    System.out.println(outtest2[0]);
    //revise an array by another way
    String[] test3 = {"test3"};
    voidReturn2(test3);
    System.out.println(test3[0]);
}

public static void voidReturn(String[] a) {
    String[] b = {"b"};
    a = b;
    System.out.println("a in voidReturn is "+ a[0]);
}

public static String[] arrayReturn(String[] a) {
    String[] b = {"b"};
    a = b;
    System.out.println("a in arrayReturn is "+ a[0]);
    return a;
}

public static void voidReturn2(String[] a) {
    a[0] = "b";
    System.out.println("a in voidReturn2 is "+ a[0]);
}

}
输出:
a in voidReturn is b
test
a in arrayReturn is b
b
a in voidReturn2 is b
b

在传递一个引用类型的时候,使引用类型指向别的引用类型,为什么在main方法中的值依然不变?(voidReturn方法)
作为返回值传出,可以修改,这是什么原理?(arrayReturn)
对引用了类型直接修改,可以改变值(voidReturn2)
表达的很模糊,大概不明确例子中的值怎么传的。希望可以知道原理和明确的理论,不是只记住这种情况是这样。

迷茫迷茫2766 天前628

全部回覆(2)我來回復

  • 高洛峰

    高洛峰2017-04-17 11:47:17

    首先,Java都是值傳遞(pass by value)。
    所有的"值"(value)都指向一個物件(primitive類型除外,就是本身)

    在傳遞一個引用類型的時候,使引用型別指向別的引用型別,為什麼在main方法中的值依然不變? (voidReturn方法)

    因為都是value,所以你的只是改了一個value,原來的value以及其所指對象當然都還在。

    作為回傳值傳出,可以修改,這是什麼原理? (arrayReturn)

    因為你回傳的是一個value,這個value指向一個對象,當然也可以修改。

    為了方便理解,你可以把這個值當成一個標籤(primitive類型當然要除外),或者如果有C/C++的基礎,把他們近似的當作 pointer/reference。

    P.S: Python 等語言同理

    回覆
    0
  • 阿神

    阿神2017-04-17 11:47:17

    雷雷

    回覆
    0
  • 取消回覆