3

我正在使用递归,我希望一个Integer对象在递归调用中保留其值。例如

public void recursiveMethod(Integer counter) {
    if (counter == 10)
        return;
    else {
        counter++;
        recursiveMethod(counter);
    }
}

public static void main(String[] args) {
    Integer c = new Integer(5);
    new TestSort().recursiveMethod(c);
    System.out.println(c); // print 5
}

但是在下面的代码中(我使用的是Counter类而不是Integer包装类,该值保持不变

public static void main(String[] args) {
    Counter c = new Counter(5);
    new TestSort().recursiveMethod(c);
    System.out.println(c.getCount()); // print 10
}

public void recursiveMethod(Counter counter) {
    if (counter.getCount() == 10)
        return;
    else {
        counter.increaseByOne();
        recursiveMethod(counter);
    }
}

class Counter {

    int count = 0;

    public Counter(int count) {
        this.count = count;
    }

    public int getCount() {
        return this.count;
    }

    public void increaseByOne() {
        count++;
    }
}

那么为什么原始包装类的行为不同。毕竟,两者都是对象,并且在递归调用中,我传递的是Integer对象,而不仅仅是int对象Integer还必须保持其值。

4

2 回答 2

10

Java 包装器类型是不可变的。他们的价值观永远不会改变。

counter++是真的counter = counter + 1;即创建了一个新对象。

于 2012-06-24T12:23:22.713 回答
-1

一些对象,如 String , Integer 等......即使它们是对象也是不可变的......

试试这个链接......

http://www.javaranch.com/journal/2003/04/immutable.htm

我建议您执行以下操作......

         public void recursiveMethod(Integer counter) 
         {
            if (counter == 10)
            return counter;  // return the value
            else 
            {
                    counter++;
                    counter=recursiveMethod(counter);
             }
         }

         public static void main(String[] args) 
         {
           Integer c = new Integer(5);
           c=(Integer)new TestSort().recursiveMethod(c);
           System.out.println(c); // print 5
          }

我相信你会发现使用两者的唯一区别是

使用 int 就像使用任何其他语言一样使用 java 原语,而 Integer 包含诸如wait(), notify(),parsing,hashcode etc 之类的方法......

于 2012-06-24T12:23:36.563 回答