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

发布于 2022-08-29 17:20:27 字数 1227 浏览 14 评论 0

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)
表达的很模糊,大概不明确例子中的值怎么传的。希望可以知道原理和明确的理论,不是只记住这种情况是这样。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心欲静而疯不止 2022-09-05 17:20:27

首先,Java都是值传递(pass by value)。
所有的"值"(value)都指向一个对象(primitive类型除外,就是本身)

在传递一个引用类型的时候,使引用类型指向别的引用类型,为什么在main方法中的值依然不变?(voidReturn方法)

因为都是value,所以你的只是改了一个value,原来的value以及其所指对象当然都还在。

作为返回值传出,可以修改,这是什么原理?(arrayReturn)

因为你返回的是一个value,这个value指向一个对象,当然也可以修改。

为了方便理解,你可以把这个值当成一个标签(primitive类型当然要除外),或者如果有C/C++的基础,把他们近似的当作 pointer/reference。

P.S: Python 等语言同理

习ぎ惯性依靠 2022-09-05 17:20:27
我喜欢把引用理解为“地址”的概念,引用传值传的是一份“地址的拷贝”,通过“地址的拷贝”修改对象值可以成功,但通过“地址的拷贝”修改地址是不会生效的,所以voidReturn2可以修改,voidReturn不会修改;
至于arrayReturn,可以看成是返回了一个地址,而String[] outtest2 = arrayReturn(test2)这句代码会让outtest2拷贝了一份返回的地址,当然是可以取到对象值的。
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文