为什么Java不允许C;“出去”;方法参数的特征

为什么Java不允许C;“出去”;方法参数的特征,java,pass-by-reference,out,Java,Pass By Reference,Out,可能重复: 有人能告诉我为什么Java在处理通过引用传递的方法参数时不提供C#“out”类型的特性吗? 我的意思是,为什么它不允许我们传递原始数据类型,比如布尔值,通过引用传递。我也尝试过使用包装类java.lang.Boolean,但仍然没有效果。它仍然不允许我通过引用传递变量。 有没有什么具体的原因使Java即使在版本7中也没有向我们提供此功能?Java只有传递值。这是在设计语言时作出的决定 只有一种参数传递模式——按值传递——这有助于保持简单 --James Gosling等人,《

可能重复:

有人能告诉我为什么Java在处理通过引用传递的方法参数时不提供C#“out”类型的特性吗? 我的意思是,为什么它不允许我们传递原始数据类型,比如布尔值,通过引用传递。我也尝试过使用包装类java.lang.Boolean,但仍然没有效果。它仍然不允许我通过引用传递变量。

有没有什么具体的原因使Java即使在版本7中也没有向我们提供此功能?

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

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

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


如果需要,可以将布尔值作为成员放入可变类中(不能使用
boolean
,因为它是不可变的),并传递对该类的引用。Apache Commons甚至有一个名为的类,您可以使用。

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

请注意,如果确实需要“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);

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

简单的回答是,这是一个设计决策,通过引用传递没有什么比通过对象引用传递更简单的了按价值计算

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

可变包装器类:

final class BooleanRef {
    public boolean value;
}
并将其用作:

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

// Call:
BooleanRef b = new BooleanRef();
changeTheBoolean( b );
或者,(更粗俗但更轻巧)封装在阵列中:

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

// Call:
boolean[] b = new boolean[1];
changeTheBoolean( b );

当你设计一种语言时,你只需要在某个地方做一个切割。一种语言不必要的特性越多,它的用处就越小……Net(C#)利用了后进者的优势,它们显示了Java中应用程序开发人员所缺少的东西,并被称为“原语类型的传递引用”。Java最初的设计并不允许,现在Oracle提供它可能非常复杂,JVM/JRE如何管理堆栈和堆,现在添加此功能还有很多其他技术限制。@Pritesh:Java并不是第一种发明的语言,在Java之前我们有很多语言,所以,“第二个移动者的优势”不是一个有力的论据。嘿,“阿拉法根,我知道java之前有N种语言:”java和.net是C++的C++派生的(带有OSS攻丝),它回答了除了生产力之外的应用软件开发中的大多数问题。java是C++的第一个,因为C++从C++中删除了不容易使用的特性。NET得到了一些时间,所以他们注意到程序员在Java中缺少什么C++类,并在.NET中对它们进行了修改,例如Opjava超载。奇怪你没提到BCL的影响谢谢Mark。是的,ApacheCommonsMutableBoolean类为我们提供了很好的选择。但我仍然不明白java的创建者所说的“保持简单”是什么意思。@TopGun743如果一个参数可以通过引用或值传递,那么对于程序员和编译器来说,这都是一个额外的复杂程度。