如何在Java中通过引用传递?

How to pass by reference in Java?

我是 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 的事情;这是故意的。

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

/** 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;
}

如果您希望方法能够做出调用者可以看到的更改,您必须传递对 non-immutable 对象的引用,而不是:

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 = ,您正在更改您在 phone 上写下某人告诉您的地址的便条。这对房子或 phone 让你告诉你地址的人的地址簿没有任何影响 - 它只会改变你能看到的东西(你 = 方法),仅此而已。因此,如果您希望更改可见,请考虑点(或数组括号),不要使用 =.