首先是父类
public class Father {
String name;
int age;
public Father(String name, int age) {
this.name = name;
this.age = age;
System.out.println("父类有参构造函数");
}
public Father(){
System.out.println("父类无参构造函数");
}
static {
System.out.println("父类静态代码块");
}
{
System.out.println("父类构造代码块");
}
public void test1(){
{
System.out.println("父类普通代码块");
}
}
}
子类
public class Son extends Father {
public Son(String name, int age) {
super(name, age);
System.out.println("子类有参构造函数");
}
public Son() {
System.out.println("子类无参构造函数");
}
static {
System.out.println("子类静态代码块");
}
{
System.out.println("子类构造代码块");
}
public void test2(){
{
System.out.println("子类普通代码块");
}
}
}
测试类
public class Test {
public static void main(String[] args) {
Son son=new Son();
}
}
看一下运行的结果
我们可以看到执行的顺序父类静态代码块
父类静态代码块
子类静态代码块
父类构造代码块
父类无参构造函数
子类构造代码块
子类无参构造函数
我们可以看到一共输出了6个结果,那为什么我们仅仅创建了一个初始化Son,会出现这种结果呢?
首先:我们创建一个Son对象,调用了Son的无参构造器,而我们的Son无参构造器会自动调用父类的无参构造器。
相当于
补充:即使我们创建一个类时,并没有写构造器,java也会默认给我们加上无参构造器,前提是没有写任何构造器。
总结:
父类静态代码块(静态变量 > 静态块) > 子类的静态代码块 > 父类构造代码块、构造方法> 子类的构造代码块、构造方法