2

可能重复:
为什么在java中无法通过引用传递

谁能告诉我为什么 Java 在处理方法参数以通过引用传递时不提供 C#“out”类型功能?我的意思是为什么它不允许我们传递像布尔值这样的原始数据类型,例如,通过引用传递。我也尝试过包装类 java.lang.Boolean 但仍然无济于事。它仍然不允许我通过引用传递变量。
即使在版本 7 中,Java 仍然没有为我们提供这个有什么具体原因吗?

4

4 回答 4

5

Java只有按值传递。这是设计语言时做出的决定。

只有一种参数传递模式——按值传递——这有助于保持简单。

-- James Gosling 等人,Java 编程语言,第 4 版

如果你愿意,你可以将你的布尔值作为一个成员放在一个可变类中(你不能使用Boolean,因为它是不可变的),并传递一个对该类的引用。Apache Commons 甚至有一个MutableBoolean可以使用的类。

于 2012-04-26T05:48:19.763 回答
1

只有语言设计团队可以告诉你为什么,但我相信不允许“out”参数的原因可能是这样的:如果你想要一个计算两件事的方法,你真正想要的是两种方法,或者一种方法返回一个对象。据说这会带来更好的设计和更可维护的代码。

请注意,如果您真的想要“输出参数”,您可以轻松使用一个元素的数组。例如:

void div(int a, int b, int[] q, int[] r) {
    if (q != null) q[0] = a/b;
    if (r != null) r[0] = a%b;
}

// elsewhere:
int[] quotient = new int[1];
int[] remainder = new int[1];
div(4, 3, quotient, remainder);
于 2012-04-26T05:59:40.483 回答
0

这只是我的观点,但我觉得 Java 的设计者相信他们可以通过消除特性来简化编程,而不是让它们更直观和更容易处理。

于 2012-04-26T05:59:50.797 回答
0

简短的回答是,这是一个设计决策,通过引用传递您无能为力,而按值传递对象引用则无法做到。

至于您的特定问题,有两种解决方案:

一个可变的包装类:

final class BooleanRef {
    public boolean value;
}

并将其用作:

// Function
void changeTheBoolean( BooleanRef b ){
    b.value = true;
}

// Call:
BooleanRef b = new BooleanRef();
changeTheBoolean( b );

或者,(更hackish但更轻量级)包装在一个数组中:

// Function
void changeTheBoolean( boolean[] b ){
    b[0] = true;
}

// Call:
boolean[] b = new boolean[1];
changeTheBoolean( b );
于 2012-04-26T06:24:40.927 回答