java整数引用

java整数引用,java,Java,我有个问题 public class Jaba { public static void main(String args[]) { Integer i = new Integer(0); new A(i); System.out.println(i); new B(i); System.out.println(i); int ii = 0;

我有个问题

public class Jaba {

    public static void main(String args[]) {
        Integer i = new Integer(0);        
        new A(i);
        System.out.println(i);
        new B(i);
        System.out.println(i);
        int ii = 0;        
        new A(ii);
        System.out.println(ii);
        new B(ii);
        System.out.println(ii);    
    }

}

class A {

    public A(Integer i) { ++i; }

}

class B {

    public B(int i) { ++i; }

}

在我看来,将int\Integer作为Integer传递给函数并在该引用上生成++应该会更改基础对象,但在所有情况下,输出都是0。为什么会这样?

大多数从Java的抽象
Number
类派生出来的类,例如
Integer
都是不可变的,即一旦构建,它们就只能包含那个特定的数字

这样做的一个有用的好处是它允许缓存。如果你打电话:

Integer i = Integer.valueOf(n);

对于
-128@Alnitak->正确。再加上这里真正发生的事情。自动装箱导致的++i的工作原理如下:

int val = Integer.intValue(); ++val;

val不会存储在任何地方,因此增量会丢失。

如其他答案所述,Java只按值调用,
++
运算符只影响变量,而不是对象。若要模拟引用调用,则需要传递可变对象(如数组)并修改其元素

JavaAPI有一些专门的对象来实现这一点,比如
Java.util.concurrent.AtomicInteger
(它还可以在多个线程上工作)和
org.omg.CORBA.IntHolder
(用于CORBA机制远程调用的引用调用)

但您也可以简单地定义自己的可变整数:

class MutableInteger {
    public int value;
}


class C {
   public C(int[] i) {
       ++i[0];
   }
}
class D {
   public D(MutableInteger i) {
       ++i.value;
   }
}
class E {
   public E(AtomicInteger i) {
       i.incrementAndGet();
   }
}
public class Jaba {
    public static void main(String args[]) {

        int[] iii = new int[]{ 0 };
        System.out.println(iii[0]);
        new C(iii);
        System.out.println(iii[0]);
        MutableInteger mi = new MutableInteger();
        System.out.println(mi.value);
        new D(mi);
        System.out.println(mi.value);
        MutableInteger ai = new AtomicInteger(0);
        System.out.println(ai);
        new E(ai);
        System.out.println(ai);
    }
}

如果要使用引用参数,请尝试此操作

利益相关者

事实上,
Number
类是抽象的、无状态的,并且有可变的子类(AtomicInteger和AtomicLong就是这样的子类,还可以定义新的自定义子类)。java只通过共享来调用
class MutableInteger {
    public int value;
}


class C {
   public C(int[] i) {
       ++i[0];
   }
}
class D {
   public D(MutableInteger i) {
       ++i.value;
   }
}
class E {
   public E(AtomicInteger i) {
       i.incrementAndGet();
   }
}
public class Jaba {
    public static void main(String args[]) {

        int[] iii = new int[]{ 0 };
        System.out.println(iii[0]);
        new C(iii);
        System.out.println(iii[0]);
        MutableInteger mi = new MutableInteger();
        System.out.println(mi.value);
        new D(mi);
        System.out.println(mi.value);
        MutableInteger ai = new AtomicInteger(0);
        System.out.println(ai);
        new E(ai);
        System.out.println(ai);
    }
}