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);
}
}
答案 0 :(得分:3)
虽然使用int
(整数的基本类型)无法实现这一点,但您可以使用AtomicInteger完成非常类似的操作。只需在类的实例上调用getAndIncrement方法即可。像这样:
public static void a(AtomicInteger b) {
b.getAndIncrement();
}
(请注意,您也无法使用java.lang.Integer执行此操作,因为java.lang.Integer是一个不可变类。)
答案 1 :(得分:3)
首先:Java不允许传递引用。此外, out-parameters (当函数的计算/结果被放入传递给它的一个或多个变量中时)不被使用;相反,某些方法是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
在一天结束时,使用上述内容需要程序员的强参数。
答案 2 :(得分:1)
对于像int这样的基本类型,你不能这样做,因为Java会按值传递基元。只需将b
包装在一个可变容器对象中:
class Holder {
int b;
}
现在您可以通过执行以下操作来修改该值:
public static void a(Holder h) {
h.b++;
}
但是,您应该考虑使用Immutable Objects,这通常被认为是Java中的好东西,可以避免副作用和并发问题。
答案 3 :(得分:0)
您无法通过Java中的引用传递值。如果将基元传递给方法,则JVM按值传递它。如果它是发送给方法的对象,则JVM会创建其引用的副本。由于这是“复制”,因此修改不会更改初始对象。但仍有一些解决方法,例如使用之前帖子中建议的AtomicInteger。