1 新建两个父子类
- Father.java
package t1;
public class Father {
{
System.out.println("父类的代码块");
}
static{
System.out.println("父类的静态代码块");
}
public Father() {
System.out.println("父类的构造方法");
}
}
- Son.java
public class Son extends Father {
{
System.out.println("子类的代码块");
}
static{
System.out.println("子类的静态代码块");
}
public Son() {
System.out.println("子类的构造方法");
}
}
2 新建测试类
2.1 只加载父类时
测试代码
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
Class.forName("t1.Son");
}
}
控制台输出
父类的静态代码块
只加载父类时,父类的静态代码块执行
2.2 只加载子类时
测试代码
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
Class.forName("t1.Son");
}
}
控制台输出
父类的静态代码块
子类的静态代码块
只加载子类时,父类的静态代码块先执行,子类的静态代码块后执行
2.3 创建父类的实例时
测试代码
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
new Father();
System.out.println("========");
new Father();
}
}
控制台输出
父类的静态代码块
父类的代码块
父类的构造方法
========
父类的代码块
父类的构造方法
创建父类的实例时,父类的静态代码块先执行,其次为代码块,构造方法(只要创建实例,代码块和构造方法都要执行,静态代码块只执行一次)
2. 4 创建子类的实例时
测试代码
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
new Son();
System.out.println("========");
new Son();
}
}
控制台输出
父类的静态代码块
子类的静态代码块
父类的代码块
父类的构造方法
子类的代码块
子类的构造方法
========
父类的代码块
父类的构造方法
子类的代码块
子类的构造方法
执行顺序
- 父类的静态代码块
- 子类的静态代码块
- 父类的代码块
- 父类的构造方法
- 子类的代码块
- 子类的构造方法
只要创建子类的实例,都会优先执行父类的代码块和构造方法,然后再执行子类的代码块和构造方法(静态代码块只在类加载的时候执行一次)