【问题标题】:How to pass by reference in Java? [duplicate]如何在 Java 中通过引用传递? [复制]
【发布时间】:2021-02-09 14:50:39
【问题描述】:

我是 Java 新手,我在 C++ 和 Python 方面有过不错的经验。现在,来自 C++,我有点怀念通过引用传递。我为我想采用的方法编写了代码:

package bs;

public class Main{

    private int a = 1;
    private int b = 11;

    public void inc(int i){
        if (i < 6){
            inc_all(this.a);
        }
        else{
            inc_all(this.b);
        }
    }

    private void inc_all(int prop){
        prop++;
    }

    public void display(){
        System.out.println(a + " " + b);
    }

    public static void main(String[] args){
        Main car = new Main();
        int i = 1;
        while( i < 11){
            car.inc(i);

            car.display();
            i++; 
        }
    }
}

现在,我可以编写两个不同的函数来递增 a、b,但我只想编写函数并根据场景传递属性(ab)。在这种情况下,属性显然没有增加(感谢按值传递)。

如何在不创建 ab 数组的情况下解决这个问题(我知道数组总是通过引用传递)?

【问题讨论】:

  • 只要你把原始类型抛在脑后,你就会发现按值传递引用(就像 Java 所做的那样)实际上允许许多与传递引用相同的操作。换句话说:如果您通过值传递对对象的引用,您仍然可以操作该对象,并且调用者将看到该操作。 唯一 你不能做的就是改变调用者传入的变量/表达式的实际(参考)值。

标签: java pass-by-reference pass-by-value


【解决方案1】:

你不能。时期。那是Java的事情;这是故意的。

一般来说,您应该对调用者进行编程,以使调用者无法更改内容,这很好。例如,而不是:

/** After calling this, `prop` has been incremented */
public void increment(int prop) {
    // this method cannot be written in java, at all.
}

你应该有:

/** Returns the value that immediately follows {@code prop} in its numeric domain. */
public int increment(int prop) {
    return prop + 1;
}

如果您希望方法能够进行调用者可以看到的更改,则必须将引用传递给非不可变对象,而不是:

AtomicInteger x = new AtomicInteger(5);
increment(x);
System.out.println(x.get()); // this prints '6'

public void increment(AtomicInteger x) {
    x.incrementAndGet();
}

这里的区别在于AtomicInteger 是可变的,而原始整数不是。如果您使用x.,您将开车到房子(x 是房子的地址,而不是房子!),进入并弄乱它。使用x = ,您正在更改您在上面草草写下某人通过电话告诉您的地址的便条。这对房子或打电话告诉你地址的人的地址簿没有任何影响——它只会改变你能看到的东西(你=方法),仅此而已。因此,如果您希望更改可见,请考虑点(或数组括号),不要使用 =

【讨论】:

  • 谢谢,所以我别无选择,只能为我的属性编写不同的函数(除了使用 AtomicInteger)。我说的对吗?
  • “通过引用传递这个原语”在java中是不可能的,是的。
猜你喜欢
  • 2010-10-10
  • 2016-02-29
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 2021-04-19
  • 2017-05-16
相关资源
最近更新 更多