关于java主动引用时,static部分的问题

justicewhite 2019-04-04 09:46:45
class SingleTon {
private static SingleTon singleTon = new SingleTon();
public static int count1;
public static int count2 = 0;
public int count3 = 0;

private SingleTon() {
count1++;
count2++;
count3++;
}

public static SingleTon getInstance() {
return singleTon;
}
}

public class TestClassLoader {
public static void main(String[] args) {
SingleTon singleTon = SingleTon.getInstance();
System.out.println("count1=" + singleTon.count1);
System.out.println("count2=" + singleTon.count2);
System.out.println("count3=" + singleTon.count3);
}
}

运行结果是:
count1=1
count2=0
count3=1

答案的分析是:
1:SingleTon singleTon = SingleTon.getInstance();调用了类的SingleTon调用了类的静态方法,触发类的初始化
2:类加载的时候在准备过程中为类的静态变量分配内存并初始化默认值 singleton=null count1=0,count2=0
3:类初始化化,为类的静态变量赋值和执行静态代码快。singleton赋值为new SingleTon()调用类的构造方法
4:调用类的构造方法后count=1;count2=1
5:继续为count1与count2赋值,此时count1没有赋值操作,所有count1为1,但是count2执行赋值操作就变为0

在4,5之间有一个疑问,为什么在调用构造方法之后,又对static块进行了一次赋值?
一、类的主动引用是这样顺序:(1)static块"值"的初始化。(2)类的构造方法。(3)static块赋值?
二、类在主动引用时,static模块初始化了两次,且与类的实例化是异步完成的?


...全文
170 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2019-04-04
  • 打赏
  • 举报
回复
这里要这样看


class SingleTon {
private static SingleTon singleTon ;
static{ singleTon=new SingleTon();}
public static int count1;
public static int count2 ;
static{count2=0;}
public int count3 = 0;

private SingleTon() {
count1++;
count2++;
count3++;
}

public static SingleTon getInstance() {
return singleTon;
}
}

先静态申请变量,singleton=null count1=0,count2=0 ;
然后在执行静态块,静态变量赋值是放在静态块中的执行的,由于 singleTon静态实例化先于count2的赋值,所以类被先被初始化,由于静态变量和静态块只执行一次,这里初始化类时不再执行,只执行count3申明和赋值,最后是类构造执行。然后才会执行静态块 count2 的赋值。 静态方法getInstance()只有在被调用时才会执行。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧