我们可以将所有包装类称为不可变的吗?

时间:2016-02-25 14:25:58

标签: java

我们可以将所有包装类称为不可变吗? 这里整数像String一样工作....所以在包装类中有混淆

    String s1 = "hi";
    concatString(s1);
    System.out.println(s1);
    Integer i = 10;
    changeInteger(i);
    System.out.println(i);


   private static void changeInteger(Integer i) {
      i=i+10;   
      System.out.println(i);
   }

    private static void concatString(String s1) {
        s1 = s1+"Bye";
        System.out.println(s1);
    }

输出:hiBye        嗨        20        10

1 个答案:

答案 0 :(得分:0)

是的,原始包装类和String是不可变的。我想你的困惑的来源是以下几行:

private static void changeInteger(Integer i) {
      i=i+10;   
      ....

确实参数类型为Integer,看起来您正在通过添加1来更改其值。实际上在自动装箱之前,此行看起来像:

i = new Integer(i.intValue() + 1);

此行从包装器中提取int值,添加1,然后将结果传递给Integer的构造函数,该构造函数创建Integer的新实例。

java 5中引入的Autoboxing是一个"编译魔术"处理行的功能

i=i+10;   

作为

i = new Integer(i.intValue() + 1);