执行顺序
静态代码块 >>> 构造代码块 >>>> 构造方法(无参构造和有参构造)
静态代码块:只执行一次
构造代码块:每次new对象都要执行
构造方法:每次new对象都要执行
测试代码
//父类
public class Teacher {
{
System.out.println("执行父类构造代码块");
}
static{
System.out.println("执行父类静态代码块");
}
public Teacher(){
System.out.println("执行父类无参构造方法");
}
public Teacher(String arg){
System.out.println("执行父类有参构造方法");
}
}
//子类
class Student extends Teacher{
{
System.out.println("执行子类构造代码块");
}
static{
System.out.println("执行子类静态代码块");
}
public Student(){
System.out.println("执行子类无参构造方法");
}
public Student(String name){
System.out.println("执行子类有参数构造方法");
}
}
//测试类
class Test1 {
public static void main(String[] args) {
System.out.println("创建父类实例,不考虑继承情况");
Teacher teacher1 = new Teacher();
System.out.println("------------------------------------------------------");
Teacher teacher2 = new Teacher("张三");
System.out.println("------------------------------------------------------");
System.out.println("创建子类实例,考虑继承情况");
Student student1 = new Student();
System.out.println("------------------------------------------------------");
Student student2 = new Student();
System.out.println("------------------------------------------------------");
Student student3 = new Student("张四");
}
}
执行结果
创建父类实例,不考虑继承情况
执行父类静态代码块
执行父类构造代码块
执行父类无参构造方法
------------------------------------------------------
执行父类构造代码块
执行父类有参构造方法
------------------------------------------------------
创建子类实例,考虑继承情况
执行子类静态代码块
执行父类构造代码块
执行父类无参构造方法
执行子类构造代码块
执行子类无参构造方法
------------------------------------------------------
执行父类构造代码块
执行父类无参构造方法
执行子类构造代码块
执行子类无参构造方法
------------------------------------------------------
执行父类构造代码块
执行父类无参构造方法
执行子类构造代码块
执行子类有参数构造方法