package com.tcl.scm.controller;
/**
* @description:
* @author: wuyuhuan
* @create: 2021-02-18
*/
public class testLazyLoad {
static {
System.out.println("主类==");
}
{
System.out.println("主类2==");
}
private testLazyLoad() {
//直调用了一次
System.out.println("主类构造方法调用");
}
//静态内部类
private static class lazyLoadSerachBase {
static {
System.out.println("1--内部类被初始化");
}
{
System.out.println("1.2--内部类被初始化");
}
public lazyLoadSerachBase(){
System.out.println("静态内部类被初始化");
}
private static final testLazyLoad serachBase = new testLazyLoad();
}
//内部类(在这里没作用,用于对比)
private class notStatic {
//不能加static--Inner classes cannot have static declarations
{
System.out.println("2--内部类被初始化");
}
public notStatic(){
System.out.println("内部类被初始化");
}
}
public static testLazyLoad getSerachBase() {
return lazyLoadSerachBase.serachBase;
}
public static void main(String[] args) {
System.out.println(1/3+2-3-2+10/2+518);//520
System.out.println(testLazyLoad.getSerachBase());
System.out.println(testLazyLoad.getSerachBase());
}
}
控制台打印:
主类==
520
1--内部类被初始化
主类2==
主类构造方法调用
com.tcl.scm.controller.testLazyLoad@78e03bb5
com.tcl.scm.controller.testLazyLoad@78e03bb5
用这个方式主要原因:
JVM对内部静态类(内部类也是)的处理方式不同。它们保持隐藏,直到实际使用时才初始化实例对象
补充:使用枚举可以天然的防止反射和反序列化调用。具体操作另寻