public class JavaApplication6 {
public static void a(int b)
{
b++;
}我调用函数a并传递变量b,目的是像C++引用(&b)一样递增它。这样行得通吗?若否,原因为何?
public static void main(String[] args) {
int b=0;
a(b);
System.out.println(b);
}
}发布于 2016-10-11 01:41:46
虽然用int (整数的原语类型)不能真正做到这一点,但可以用AtomicInteger完成一些非常类似的事情。只需在类的实例上调用getAndIncrement方法即可。如下所示:
public static void a(AtomicInteger b) {
b.getAndIncrement();
}(请注意,使用java.lang.Integer也不能做到这一点,因为java.lang.Integer是一个不可变的类。)
发布于 2016-10-11 01:57:43
首先: Java不允许按引用传递。此外,不使用输出参数(当函数的计算/结果放在传递给它的一个或多个变量中时);取而代之的是,从如下方法中return出一些东西:
b = a(b);否则,在Java语言中,将对象作为指针传递(which are incorrectly called references)。不幸的是(在您的例子中)大多数类型都对应于int (Integer、BigInteger等)是不可变的,因此不能在不创建新属性的情况下更改对象中的属性。但是,您可以进行自己的实现:
public static class MutableInteger {
public int value;
public MutableInteger(int value) {
this.value = value;
}
}
public static void main(String[] args) {
MutableInteger b = new MutableInteger(2);
increment(b);
System.out.println(b.value);
}
public static void increment(MutableInteger mutableInteger) {
mutableInteger.value++;
}运行此代码时,以下内容将打印到控制台:
3归根结底,使用上面的方法需要程序员使用强参数。
发布于 2016-10-11 02:06:35
对于int这样的基元类型,您无法做到这一点,因为Java通过值传递基元。只需将b包装在可变容器对象中:
class Holder {
int b;
}现在您可以通过执行以下操作来修改该值:
public static void a(Holder h) {
h.b++;
}但是,您应该考虑使用Immutable Objects,这在Java语言中通常被认为是一件好事,以避免副作用和并发问题。
https://stackoverflow.com/questions/39963625
复制相似问题