单例模式中静态变量初始化与不初始化有什么区别?

来源:互联网 发布:java基础教程下载 编辑:程序博客网 时间:2024/05/16 00:47
单例模式中静态变量初始化与不初始化有什么区别? 
public class Singleton { 
private static Singleton obj = new Singleton(); 
public static int counter1; 
public static int counter2 = 0; 
private Singleton(){ 
counter1++; 
counter2++; 


public static Singleton getInstance(){ 
return obj; 


public static void main(String[] args) { 

Singleton obj = Singleton.getInstance(); 
System.out.println("obj.counter1: " + obj.counter1); 
System.out.println("obj.counter2: " + obj.counter2); 



输出的结果是1, 0; 
请问在此 
public static int counter1; 
public static int counter2 = 0; 

的区别是什么?谢谢! 


//************************************************

这个和Java初始化顺序有关, 
由于你的第一句是 
private static Singleton obj = new Singleton(); 
所以在初始化静态变量obj时中间插入了一个构造函数,造成了counter1和counter2最后的结果不一样。完整的时间链如下 

1) JVM调用Singleton.Main,由于这是一个static method,JVM必须构造Singleton的所有static member,按照Java Specifiction的要求,指针被初始化为null,数值为0。到此为止 counter1=0,counter2=0 

2)接下来,按照自上而下的顺序,完成所有static member的赋值操作。第一个赋值操作是(static)obj = new Singleton() ,JVM会调用Singleton的构造函数,完成counter1和counter2的赋值。到此为止 counter1=1,counter2=1 

3)接着执行的是rivate static Singleton obj = new Singleton();的下一句(public static int)counter2 = 0;到此为止 counter1=1,counter2=0 


你可以试试把private static Singleton obj = new Singleton();放到最后,则结果就都是1了。 

另外说一句,你这个所谓单例的用法是不正确的。既然已经把Singleton设为单例,counter1和counter2也就没有必要设为static,这样由于static member会在non static member面前被初始化,自然就没有这个问题了。同时由于Singleton被设为了单例,也不用担心把counter1和counter2前面的static去掉会造成空间方面的浪费。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 公务员准考证丢了怎么办 行测老打40多分怎么办 网上没有报名的怎么办? 上大学转户口怎么办 梅菜扣肉勾芡怎么办 有个精神病妈妈怎么办 妈得了精神病该怎么办 思维不正常的人怎么办 妈妈是个精神病怎么办 我老婆有精神病怎么办 在郑州怎么办完税证明 中专没考上大专怎么办 考研两次没考上怎么办 2018造价员取消后怎么办 造价员取消了投标怎么办 造价员考试取消后怎么办 只拿到结业证怎么办 本科只有结业证怎么办 健身后肌肉水肿怎么办 大腿面肌肉疼怎么办 跑步后大腿酸疼怎么办? 运动后大腿胀痛怎么办 尔雅课程没看完怎么办 国家课程校本化怎么办 上海买房限购怎么办 投资公司要求回购股份怎么办 超过应届生落户年龄怎么办 造价员章到期了怎么办 造价员继续教育过期了怎么办 sd卡存储不够怎么办? 进项税大于销项税怎么办 公司扣员工奖金怎么办 墙面大面积有霉怎么办 电脑总是断网怎么办 造价师资格证书丢了怎么办 行测做题速度太慢怎么办 普通话准考证丢了怎么办 信用卡还款逾期了怎么办 淮北建洗煤厂需要怎么办 建设工程不结算怎么办 考监理没有职称怎么办