package TestDemo; public class StaticDemo01 { static { System.out.println("StaticDemo01静态代码块执行"); } // Java没有静态构造函数 public StaticDemo01(){ System.out.println("StaticDemo01构造函数执行"); } // 非静态代码块 { System.out.println("StaticDemo01非静态代码块执行"); } }
package TestDemo; public class StaticDemo02 extends StaticDemo01 { static { System.out.println("StaticDemo02静态代码块执行"); } // Java没有静态构造函数 public StaticDemo02(){ System.out.println("StaticDemo02构造函数执行"); } // 非静态代码块 { System.out.println("StaticDemo02非静态代码块执行"); } }
package TestDemo; public class Test { public static void main(String[] args){ StaticDemo02 demo = new StaticDemo02(); } }
输出
StaticDemo01静态代码块执行
StaticDemo02静态代码块执行
StaticDemo01非静态代码块执行
StaticDemo01构造函数执行
StaticDemo02非静态代码块执行
StaticDemo02构造函数执行
结论:
1. 静态代码块仅执行一次且在构造函数与非静态代码块之前执行
2. 非静态代码块在构造函数之前执行
3. 父类静态与非静态分别均在子类之前执行
当类首次被加载时,静态变量就被分配到内存中,知道程序结束才会释放