如何在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,但我只想编写函数并根据情况传递属性(a
或 b
)。在这种情况下,属性显然没有增加(由于按值传递)。
如何在不创建 a
和 b
数组的情况下解决这个问题(我知道数组总是通过引用传递)?
你不能。时期。那是 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 让你告诉你地址的人的地址簿没有任何影响 - 它只会改变你能看到的东西(你 = 方法),仅此而已。因此,如果您希望更改可见,请考虑点(或数组括号),不要使用 =
.
我是 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,但我只想编写函数并根据情况传递属性(a
或 b
)。在这种情况下,属性显然没有增加(由于按值传递)。
如何在不创建 a
和 b
数组的情况下解决这个问题(我知道数组总是通过引用传递)?
你不能。时期。那是 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 让你告诉你地址的人的地址簿没有任何影响 - 它只会改变你能看到的东西(你 = 方法),仅此而已。因此,如果您希望更改可见,请考虑点(或数组括号),不要使用 =
.