关于Integer对象的一些小知识

来源:互联网 发布:朝勇投资有限公司 知乎 编辑:程序博客网 时间:2024/05/21 02:36

之前有看见一个题,题就不说了,最终结论是 Integer对象在创建的时候,对于-128~127数字将会不会创建新的对象,而是直接应用常量池中Integer对象。


然后最近,在StackOverflow看到一个比较有意思的问题

public class Test {    public static final Test me = new Test();    public static final Integer I = 4;    public static final String S= "abc";    public Test() {        System.out.println(I);        System.out.println(S);    }    public static Test getInstance() { return me; }    public static void main(String[] args) {        Test.getInstance();    }} 
最终运行输出的结果则是

null

abc


为何是这个结果。如果把

public static final Integer I = 4;
替换为

public static final int I = 4;
那么打印的结果就会是4 和 abc

为何会这样

因为在创建静态常量的时候, Integer I=4 最终调用的是 Integer.valueOf(4),而不是直接在常量池中创建对象。那么导致的则是在初始化的时候,常量池中并没有Integer对象的值。

而String类型 则直接会在常量池中创建对象,所以可以直接调用该值。


所以在第一次初始化常量的时候,Integer 由于内部产生对象调用的是Integer.valueOf()的方法,而常量池中并没有相匹配的值,导致第一次初始化后Integer是一个空值。当第一次初始化结束后,Integer常量对象才会产生相对应的值。

而之后在 new Test();或者调用该实例化方法 getInstance() 是,才会显示Integer常量对象

 public static void main(String[] args) {
<span style="white-space:pre"></span>new Test();        Test.getInstance();    }
输出结果为:
null
abc
4
abc



0 0