如何增加类Integer从另一个方法引用java中的值

cch*_*ion 27 java pass-by-reference

package myintergertest;

/**
 *
 * @author Engineering
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        //this one does not increment 
        Integer n = new Integer(0);
        System.out.println("n=" + n);
        Increment(n);
        System.out.println("n=" + n);
        Increment(n);
        System.out.println("n=" + n);
        Increment(n);
        System.out.println("n=" + n);
        Increment(n);

        //this one will increment
        MyIntegerObj myInt = new MyIntegerObj(1);
        Increment(myInt);
        System.out.println("myint = " + myInt.get());
        Increment(myInt);
        System.out.println("myint = " + myInt.get());
        Increment(myInt);
        System.out.println("myint = " + myInt.get());

    }

    public static void Increment(Integer n) {
        //NO.  this doesn't work because a new reference is being assigned
        //and references are passed by value in java
        n++;
    }

    public static void Increment(MyIntegerObj n) {
        //this works because we're still operating on the same object
        //no new reference was assigned to n here.
        n.plusplus();   //I didn't know how to implement a ++ operator...
    }
}
Run Code Online (Sandbox Code Playgroud)

所有这些的结果是n = 0.整数n是一个对象,因此通过引用传递,那么为什么增量不会反映在调用方法(main)中?我期望输出为n = 0 n = 1 n = 2等...

更新:注意我更新了上面的代码示例.如果我理解正确,Jon Skeet回答了为什么myInt会增加以及为什么n不会增加的问题.这是因为n正在获取在Increment方法中指定的新引用.但myInt没有被分配一个新的引用,因为它调用了一个成员函数.

这听起来像我理解正确吗?

Jon*_*eet 38

不,对象不通过引用传递.参考文献通过价值传递 - 这有很大的不同.Integer是一个不可变类型,因此您无法更改方法中的值.

你的n++;陈述是有效的

n = Integer.valueOf(n.intValue() + 1);
Run Code Online (Sandbox Code Playgroud)

所以,这赋予不同的值的变量nIncrement-但如Java 具有传递的价值,不影响价值n的调用方法.

编辑:回答你的更新:是的.据推测,您的"MyIntegerObj"类型是可变的,并在您调用时更改其内部状态plusplus().哦,不要四处寻找如何实现运算符 - Java不支持用户定义的运算符.

  • 不,他没有.基元和引用按值传递.对象根本不通过; 他们住在堆里. (9认同)

Der*_*ike 24

你可以使用一个AtomicIntegerjava.util.concurrent.atomic.它有一个'incrementAndGet'方法,适合您的展示.


Ita*_*man 6

您正在寻找类似于C++参考或C#'out参数的东西.Java(和许多其他语言)不支持这一点.

通常通过将方法从void更改为(在本例中)int来实现此类行为: public static int increment(int n) { return ++n; }

如果该方法已经返回了某些内容,那么您可以创建一个具有两个字段(甚至可以是公共字段)的新类:原始返回值和n的新值.

或者,您也可以将整数包装在通用Cell类中.你只需要写一次这个Cell类:

public class Cell<T> {
  public Cell(T t) { value = t; }
  public void set(T t) { value = t; }
  public T get() { return value; }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在需要更改基元的方法的所有情况下使用它:

public static void increment(Cell<Integer> n) {
  n.set(n.get()++);
}

Cell<Integer> n = new Cell<Integer>(0);
increment(n);
increment(n);
increment(n);
System.out.println(n.get()); // Output: 3
Run Code Online (Sandbox Code Playgroud)