静态代码块、构造代码块、构造方法、静态方法等(父子类)执行顺序
验证结果:静态代码块>构造代码块>构造方法>静态方法>普通代码块
验证代码如下
public class Son extends Father {
private String name;
public Son(String name) {
super(name);
this.name = name;
System.out.println("子类带参数构造");
}
public Son() {
System.out.println("子类不带参数构造");
}
public static void say() {
System.out.println("我是子类静态方法");
}
public void sayHello() {
System.out.println("我是子类成员方法");
}
static {
System.out.println("子类静态代码块1");
}
static {
System.out.println("子类静态代码块2");
}
{
System.out.println("子类构造代码快");
}
public static void main(String[] args) {
System.out.println("-------------分隔线:执行无参对象创建及方法(第一次)-------------------");
Father father1 = new Son();
father1.sayHello();
System.out.println("-------------分隔线:执行无参对象创建及方法(第二次)-------------------");
Father father2 = new Son();
father2.sayHello();
System.out.println("-------------分隔线:执行带参对象创建及方法-------------------");
Father father3 = new Son("Carson");
father3.sayHello();
System.out.println("-------------分隔线:执行静态方法-------------------");
Son.say();
}
}
class Father {
private String name;
public Father(String name) {
this.name = name;
System.out.println("父类带参数构造");
}
public Father() {
System.out.println("父类不带参数构造");
}
public static void say() {
System.out.println("我是父类静态方法");
}
public void sayHello() {
System.out.println("我是父类成员方法");
}
static {
System.out.println("父类静态代码块1");
}
static {
System.out.println("父类静态代码块2");
}
{
System.out.println("父类构造代码快");
}
}
执行结果如下
父类静态代码块1
父类静态代码块2
子类静态代码块1
子类静态代码块2
-------------分隔线:执行无参对象创建及方法(第一次)-------------------
父类构造代码快
父类不带参数构造
子类构造代码快
子类不带参数构造
我是子类成员方法
-------------分隔线:执行无参对象创建及方法(第二次)-------------------
父类构造代码快
父类不带参数构造
子类构造代码快
子类不带参数构造
我是子类成员方法
-------------分隔线:执行带参对象创建及方法-------------------
父类构造代码快
父类带参数构造
子类构造代码快
子类带参数构造
我是子类成员方法
-------------分隔线:执行静态方法-------------------
我是子类静态方法
有这么几点说明
(下面所说的,对象的创建,是new出来的对象)
- 静态代码块
- 不管对象创建几次(或者说不管创不创建对象),只执行一次,且优先级最高(因为在对象创建之前就已加载完毕)
- 多个静态代码块按代码顺序来执行
- 构造代码块
- 创建几次对象就执行几次,优先级在静态代码块之后,在构造方法之前执行
- 构造方法
- 创建几次就执行几次,在静态方法之前执行
- 静态方法
- 在构造方法之后执行(因为类得先加载出来,才能执行此类的静态方法。然而在加载该类时,构造代码块和构造方法就执行了)