结论:加载类时,首先运行父类的静态代码块,再执行子类的静态代码块;类中出现多个静态代码块,则按从上到下次序执行。
创建类时,首先运行父类中的非静态代码块,构造方法,再执行子类的非静态代码块,构造方法;类中出现多个非静态代码块时,按从上到下次序执行;
注意:当创建类时,该类未加载,则先加载类,再创建类。
class Parent {
static String name = "parent";
{
System.out.println("parent block");
}
static {
System.out.println("parent static block one");
}
public Parent() {
System.out.println("parent constructor");
}
static {
System.out.println("parent static block two");
}
}
class Child extends Parent {
static String childName = "child";
{
System.out.println("child block one");
}
static {
System.out.println("child static block one");
}
public Child() {
System.out.println("child constructor");
}
static {
System.out.println("child static block two");
}
{
System.out.println("child block two");
}
}
测试1(加载类):
public static void main(String[] args) throws InterruptedException,
ClassNotFoundException {
// new Child();
Class.forName("Child");
}
输出结果:
parent static block one
parent static block two
child static block one
child static block two
测试2(创建类):
public static void main(String[] args) throws InterruptedException,
ClassNotFoundException {
new Child();
// Class.forName("Child");
}
输出结果:
parent static block one
parent static block two
child static block one
child static block two
parent block
parent constructor
child block one
child block two
child constructor
测试3(先加载,再创建):
public static void main(String[] args) throws InterruptedException,
ClassNotFoundException {
Class.forName("Child");
System.out.println("--load-end--");
new Child();
}
输出结果:
parent static block one
parent static block two
child static block one
child static block two
--load-end--
parent block
parent constructor
child block one
child block two
child constructor