程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

更改Java中方法中传递的参数的值?

发布于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黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

30 0
收藏该文
已收藏

评论内容:(最多支持255个字符)