类字面常量

  • final 静态域不会触发类的初始化操作
    • 非 final static 静态域(以及构造器其实是一种隐式的静态方法)
    • Class.forName():会自动的初始化;
      • 使用 .class来创建对 class 对象的引用,不会自动地初始化该 class 对象,初始化被延迟到了对静态方法(构造器隐式的是静态的)或者非final静态域(注意final静态域不会触发初始化操作)进行首次引用时才执行。

1. static{} 静态代码块与 {} 非静态代码块

  • 二者均是在 JVM 加载类时,且在构造函数执行之前执行,在类中可以定义多个, 一般在代码块中对一些 static 变量进行赋值;
  • 静态代码块的执行顺序要先于非静态代码块(静态代码块 ⇒ 非静态代码块 ⇒ 构造方法)
  • 静态代码块仅在第一次调用 new 时仅执行一次,之后不再执行,而非静态代码块在每 new 一次就执行一次,
    • 非静态代码块可在普通方法中定义,

2. static{} 静态代码块与静态方法

  • 静态代码块必须在项目启动的时候就执行,这种代码是主动执行的,
    • 而需要在项目启动的时候就初始化,不通过创建对象,由其他程序来调用,需要使用静态方法,显然这种代码是被动执行的;静态方法在类加载的时候,就已经加载,可以用类名直接调用;
  • 如 main 方法就必须是静态的,其作为程序的入口;

references