1. 在没有继承关系上的执行顺序
public class Person {
public String name;
public int age;
public Person(String name, int age){
this.name = name;
this.age = age;
System.out.println("构造方法执行");
}
{
System.out.println("实例代码块执行");
}
static {
System.out.println("静态代码块执行");
}
}
public class TestDemo{
public static void main(String[] args) {
Person person1 = new Person("A", 10);
System.out.println("---------------");
Person person2 = new Person("B", 20);
}
}
执行结果
静态代码块执行
实例代码块执行
构造方法执行
---------------
实例代码块执行
构造方法执行
结论
- 静态代码块只执行一次;
- 静态代码块先执行,实例代码块紧接着执行,最后构造方法执行。
2. 继承关系上的执行顺序
public class Person {
public String name;
public int age;
public Person(String name, int age){
this.name = name;
this.age = age;
System.out.println("Person: 构造方法执行");
}
{
System.out.println("Person: 实例代码块执行");
}
static {
System.out.println("Person: 静态代码块执行");
}
}
public class Student extends Person{
public Student(String name, int age) {
super(name, age);
System.out.println("Student: 构造方法执行");
}
{
System.out.println("Student: 实例代码块执行");
}
static {
System.out.println("Student: 静态代码块执行");
}
}
public class TestDemo{
public static void main(String[] args) {
Student student1 = new Student("C", 15);
System.out.println("-------------");
Student student2 = new Student("D", 17);
}
}
执行结果
Person: 静态代码块执行
Student: 静态代码块执行
Person: 实例代码块执行
Person: 构造方法执行
Student: 实例代码块执行
Student: 构造方法执行
-------------
Person: 实例代码块执行
Person: 构造方法执行
Student: 实例代码块执行
Student: 构造方法执行
结论
- 父类静态代码块优先于子类静态代码块执行;
- 父类的实例代码块和父类构造方法执行;
- 子类的实例代码块和子类构造方法执行;
- 第二次实例化子类对象时,父类和子类的静态代码块都不会执行。