刚开始学习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的可以变。
------解决思路----------------------
你的理解基本都是正确的,当我们使用 Integer i = xxx; 这样的语句时,是在使用自动装箱功能,自动装箱就是调用了valueOf()方法, 显然如果大于127 会new 新的。如果cache范围内就返回IntegerCache.cache[i + (-IntegerCache.low)]; 这句的结果,你再把它里面的代码看一下就明白了全部的过程。
虽然你没有创建对象,但 i1 已经指向cache里面的100了,当然不再是原来的1000。