初始化顺序问题,为什么会这样?

月凉西厢 2016-04-25 04:13:04
package com.mengdd.classloader;

class Singleton {

// private static Singleton mInstance = new Singleton();// 位置1
// 位置1输出:
// counter1: 1
// counter2: 0
public static int counter1;
public static int counter2 = 0;

private static Singleton mInstance = new Singleton();// 位置2

// 位置2输出:
// counter1: 1
// counter2: 1

private Singleton() {
counter1++;
counter2++;
}

public static Singleton getInstantce() {
return mInstance;
}
}

public class Test1 {

public static void main(String[] args) {

Singleton singleton = Singleton.getInstantce();
System.out.println("counter1: " + Singleton.counter1);
System.out.println("counter2: " + Singleton.counter2);
}
}

我知道这样的输出结果是由于初始化顺序造成的,但是构造方法为什么会先于静态代码执行?
private static Singleton mInstance = new Singleton();这句到底执行了什么?
...全文
103 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
PJ_Richard 2016-04-25
  • 打赏
  • 举报
回复
类被加载后,在准备阶段,会为静态成员分配内存并设默认初始化值。当类被调用时,初始化类。 主函数调用getInstance,那个类被初始化,先进行静态赋值及静态块。在位置一时,调用构造函数,两个变量均为1,然后继续往下走,count1没有初始化动作count2有,重新赋值为0。同理位置2。 建议参考类的生命周期
qq_20062767 2016-04-25
  • 打赏
  • 举报
回复
静态属性和方法会类加载的时候执行,private static Singleton mInstance = new Singleton();这行代码是最先执行的,接着就调用构造方法创建实例。

62,614

社区成员

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

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