引言:
这两天在学习设计模式, 其中单例模式有种实现是通过静态内部类方式实现, 有些不可思议, 故在此做个小实验验证一下静态内部类的加载时机
代码:
public class TestStatic {
private static long OUTER_TIME = System.currentTimeMillis();
static {
System.out.println("外部静态代码块执行了:" + System.currentTimeMillis());
}
public TestStatic() {
System.out.println("外部构造方法执行了:" + System.currentTimeMillis());
}
// 内部类
class InnerClass{
public InnerClass() {
System.out.println("非静态内部类构造方法执行了:" + System.currentTimeMillis());
}
}
// 静态内部类
static class StaticInnerClass{
public static long STATIC_INNER_TIME = System.currentTimeMillis();
static {
System.out.println("静态内部类静态代码块执行了:" + System.currentTimeMillis());
}
}
public static void main(String[] args) {
/*
* 执行此行代码, 调用外部成员变量
* 输出结果:
* 外部静态代码块执行了:1574749944398
*/
long t1 = TestStatic.OUTER_TIME;
/*
* 执行此行, 调用外部类构造
* 输出结果:
* 外部静态代码块执行了:1574750008319
* 外部构造方法执行了:1574750008319
*/
//new TestStatic();
/*
* 执行此行, 调用非静态内部类构造
* 输出结果:
* 外部静态代码块执行了:1574750048601
* 外部构造方法执行了:1574750048602
* 非静态内部类构造方法执行了:1574750048602
*/
//InnerClass innerClass = new TestStatic().new InnerClass();
/*
* 执行此行, 调用静态内部类
* 输出结果:
* 外部静态代码块执行了:1574750082207
* 静态内部类静态代码块执行了:1574750082208
*/
//long sTATIC_INNER_TIME = StaticInnerClass.STATIC_INNER_TIME;
}
}
误区:
一直以为只要是static修饰的静态资源只要在类加载时就会执行, 所以静态内部类在外部类加载时也会执行, 其实是 错误 的.
总结:
不管是静态内部类还是非静态内部类, 不会因为外部类的加载而加载; 静态内部类的加载也会使外部类加载完成, 但外部类的构造方法不会执行