发布于2022-06-24 17:03 阅读(1034) 评论(0) 点赞(30) 收藏(4)
在详细介绍之前,我想澄清一下,我确实理解 Java 是 Pass-by-Value 而不是 Pass-by-Reference,但我有点困惑,因为我已经看到一些函数这样做了. 我想了解他们是如何做到的。
我想发生的事情:
public void yo() {
int a = 1;
String b = "hello";
Boolean c = false;
doSomething(a,b,c);
// a,b,c should have new values
}
public void doSomething(int x, String y, Boolean z) {
// Do Something
}
我见过的功能是这样做的:
// Works in Android Development
int[] location = new int[2];
view.getLocationInWindow(location);
// `location` has a new value now
// Same happens when you run getLocationOnScreen(arg)
这是如何运作的?
首先:您是绝对正确的,Java 纯粹是按值传递。
要记住的关键是,当我们有一个location
引用数组或对象的变量时,该变量实际上并不包含数组或对象,它包含对内存中其他地方的数组或对象的引用。这是数组/对象和原语之间的最大区别。考虑这段代码:
int primitive = 5;
int[] ref = new int[2];
这让我们记忆犹新:
+-----------+ | 原始 | +-----------+ | 5 | +-----------+ +-----------+ | 参考 | +-----------+ +--------+ | 参考 |----->| 整数[2] | +-----------+ +--------+ | 0 | | 0 | +--------+
注意区别。那么上面的“参考”是什么?它是一个值,例如 123456789,VM 使用它来定位内存中的数组。我们无法知道它的价值,我们也不在乎它。我们只关心虚拟机知道如何解释它。
所以你引用的代码可以修改数组,因为传递给函数的值是对数组的引用的副本,而不是数组的副本。使用该引用修改数组会修改该数组的一个副本,因此无论您使用哪个引用副本查看这些修改,您都可以看到这些修改。
在这一行之后:
int[] location = new int[2];
...我们在内存中有这个:
+-----------+ | 位置 | +-----------+ +--------+ | 参考 |------>| 整数[2] | +-----------+ +--------+ | 0 | | 0 | +--------+
然后,当你这样做时:
view.getLocationInWindow(location);
在 中getLocationInWindow
,它接收引用的副本(因为 Java 是按值传递的),所以说getLocationInWindow
的参数名称是foo
,在调用期间我们有这个:
+-----------+ | 位置 | +-----------+ +--------+ | 参考 |---+-->| 整数[2] | +-----------+ | +--------+ | | 0 | | | 0 | +-----------+ | +--------+ | 富 | | +-----------+ | | 参考 |---+ +-----------+
通过引用的任一副本访问该数组,将访问同一个数组。(同样,对象引用也是如此。)
作者:黑洞官方问答小能手
链接:http://www.javaheidong.com/blog/article/463674/733098d44f108c7b9adf/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!