class A{
int i=0;
}public class Test2 { private static final int i=0;
private static final Integer integer= new Integer("1");
private static final A a=new A();
private static final String string="a"; public static void main(String[] args) {
a.i++;

//string="string"; 报错 因为是final的 所以不能让它重新指向别的对象
//i++;报错 说integer是final的
//integer++; 报错了 和上面一样

//可是integer 明明是包装器类型啊 难道说integer++ 让它重新指向了一个新的 Integer对象?
//我在java编程思想里 看到 作者说
//final 修饰的 int 不可以改变值 但是 换成Integer 其值 就是可以改变的
// 不知道是不是 jdk版本的问题
}

}

解决方案 »

  1.   

    i++ 相当于 i = i +1 ; 就是重新赋值嘛
    integer ++ 相当于 integer = integer + 1 ;就相当于引用指用一个新的Integer对象
      

  2.   

    final修饰的基本类型是不允许改变值的
    final修饰的引用类型是不允许重新指向别的对象
      

  3.   

    这个我知道啊
    我只是奇怪 Integer 是对象类型 integer++ 居然让它重新指向了一个对象
      

  4.   

    Integer 类在对象中包装了一个基本类型 int 的值。Integer 类型的对象包含一个 int 类型的字段。 java doc中是这么描述的按理说integer++ 应该是改变它封装起来的 int 的值才对啊
    就和a.i++ 一样才对嘛难道 java编程思想的作者 自己都没有试过 就乱说?
      

  5.   

    你就把Integer看成是int 一旦被final就不能改变其值了
      

  6.   


    一样吗????
    i是A类中的一个属性,a.i++和integer++不一样,
    首先final是终态的意思,只能赋值一次,a.i++只是改变A类中的属性i的值,integer势必会造成重新赋值、、
      

  7.   

    那么为什么 “integer势必会造成重新赋”?
    而不是改变 integer当中的 int 属性?
      

  8.   

    java里面的封装类都是final的,例如String str = "ss"; str += "d";那么str就重新变为另一个对象的引用了,这就改变了原来final的引用了