本帖最后由 guyouzhong 于 2017-1-15 00:37 编辑
今天在看单例设计模式的时候突然发现一个问题,突然在感慨真的很多小知识点都是这种小的发现,我们一步步去探索才能真正理解的,加油。
具体看代码:
[Java] 纯文本查看 复制代码 public class Intance01 {
public static void main(String[] args) {
Abs.getInstance();//获取实例
}
}
/**@author tony*/
class Abs{
private static Abs abs = new Abs();
private static int a = 11;
static{
System.out.println("static===="+a+"===");
a = 22;
}
{
System.out.println("初始化===="+a+"===");
a = 33;
}
private Abs(){
System.out.println("构造===="+a+"===");
}
public static Abs getInstance(){
return abs;
}
} 运行结果为:
初始化====0===
构造====33===
static====11===
分析运行过程:
第一步:主函数中Abs.getInstance();执行时,Abs类需要加载;执行了private static Abs abs = new Abs();
第二步:运行初始化代码块,因为此时a还没有进行显式初始化所以输出 a = 0;
第三步:运行构造函数,输出a = 33;
第四步:运行private static int a = 11;,a 的显式初始化
第五步:静态代码块执行,输出结果为 a = 11;
----------------------------------------------------------
下面我将代码颠倒了一下顺序:
[Java] 纯文本查看 复制代码 * 静态代码、静态变量遵循哪个在前面,哪个先加载个原则.
/** @author tony*/
class Abs{
private static int a = 11;
static{
System.out.println("static===="+a+"===");
a = 22;
}
{
System.out.println("初始化===="+a+"===");
a = 33;
}
private static Abs abs = new Abs();
private Abs(){
System.out.println("构造===="+a+"===");
}
public static Abs getInstance(){
return abs;
}
}
输出结果为:
static====11===
初始化====22===
构造====33===
分析执行过程:
第一步:主函数中执行Abs.getInstance()时,Abs类需要加载,然后执行private static int a = 11;
第二步:静态代码块,输出结果为:a = 11;
第三步:private static Abs abs = new Abs();
第四步:执行构造代码块并输出a = 22;
第五步:执行构造函数,输出 a = 33;
通过以上的两个案例的分析可以得出:类在加载的时候,静态代码、静态变量遵循哪个在前面,哪个先加载个原则.
|