关于Integer对象的一些小知识

之前有看见一个题,题就不说了,最终结论是 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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值