当前位置: 代码迷 >> J2SE >> Java中Integer有关问题,final value咋回事
  详细解决方案

Java中Integer有关问题,final value咋回事

热度:168   发布时间:2016-04-23 19:47:49.0
Java中Integer问题,final value怎么回事?
刚开始学习java,晚上遇到一个棘手的问题!直接看代码吧
下面是一段从jdk1.7中拷贝的Integer的代码段
    private final int value;
    public Integer(int value) {
        this.value = value;
    }
这里的意思就是value是常量,然后下面是一个构造器,然后我的测试如下:
Integer in = 1000;//问题1
Integer in1 = in;   //问题2
System.out.println( "first:"+in.intValue() + " "+in1.intValue());
in1 = 1020;//问题3
System.out.println( "second:"+in.intValue() + " " + in1.intValue() );
问题列出如下:
问题1:简单的浏览了一下Integer.java,结合书上的介绍,当赋值在-128-127之间时,用缓存值(在方法valueof里面),那么这行代码的调用顺序是什么?不是直接调用构造器?
问题2:同样这里的调用顺序有是什么?
问题3:这个比较费解,上述value明明就是final,这里怎么就变了呢?难道是赋值改变导致创建了一个新的对象?

------解决思路----------------------
当赋值在-128-127之间时,用缓存值,这是没错的
Integer in = 1000;//问题1
这个就是相当于Integer in =new Integer(1000);

而Integer in1 = in;   //问题2
相当于in1这个变量指向了与in相同的地址,故其值与in相同均为1000

而in1 = 1020;//问题3
就和问题1一样,in1又重新new出了一个对象,即in1 =new Integer(1020);这时in1这个变量指向的地址就改变了,而in这个变量指向的地址不变

至于你说的那个,value明明就是final,这里怎么就变了呢?你说的没错,赋值就相当于创建了一个新的对象,但是如果你附的值是在-128-127之间的,就会直接用缓存中的值而不是新new对象。
------解决思路----------------------
1,调用构造器
2,就只是引用指了一下
3,对象没变,引用指了一个新对象,引用不是final的可以变。
------解决思路----------------------
引用:
Quote: 引用:

当赋值在-128-127之间时,用缓存值,这是没错的
Integer in = 1000;//问题1
这个就是相当于Integer in =new Integer(1000);

而Integer in1 = in;   //问题2
相当于in1这个变量指向了与in相同的地址,故其值与in相同均为1000

而in1 = 1020;//问题3
就和问题1一样,in1又重新new出了一个对象,即in1 =new Integer(1020);这时in1这个变量指向的地址就改变了,而in这个变量指向的地址不变

至于你说的那个,value明明就是final,这里怎么就变了呢?你说的没错,赋值就相当于创建了一个新的对象,但是如果你附的值是在-128-127之间的,就会直接用缓存中的值而不是新new对象。

您说的很清楚,运行的结果我也明白了,但是还有疑问,假如我这样用:
Integer i = 1000; //调用构造器,将域value置为1000
i1 = 100;
问题如下:第二句i1=100,这里是不是调用valueOf这个函数,然后使用缓存值,就不会new一个新对象?
如果是这样的话,我看了一下代码:
    public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
代码没有修改value的值,既然没有创建新对象,i1还是指向原来的对象,value应该是原来的1000,但是通过Field获取value得出的是100,这是怎么回事?
我刚学java,还请耐心回复,描述有错,还望指出来!谢谢

你的理解基本都是正确的,当我们使用 Integer i = xxx;  这样的语句时,是在使用自动装箱功能,自动装箱就是调用了valueOf()方法, 显然如果大于127 会new 新的。如果cache范围内就返回IntegerCache.cache[i + (-IntegerCache.low)]; 这句的结果,你再把它里面的代码看一下就明白了全部的过程。

虽然你没有创建对象,但 i1 已经指向cache里面的100了,当然不再是原来的1000。
  相关解决方案