public class ClassA {
public String str;
{
System.out.println("父类的构造代码块1");
}
{
System.out.println("父类的构造代码块2");
}
public ClassA(){
System.out.println("父类的无参构造1");
}
ClassB b=new ClassB();
static {
System.out.println("父类的静态代码块1");
}
public ClassA(String str) {
System.out.println("父类的有参构造"+str);
}
public static void main(String[] args) {
ClassA classA=new ClassA();
//输出父类的静态代码块1 父类的构造代码块1 父类的构造代码块2 classB 父类的无参构造1
}
}
public class ClassB {
public ClassB() {
System.out.println("classB");
}
}
总结:
情况一:非继承状态下
- 先加载子类的(静态代码块,静态变量),接下来再执行main函数
- 创建调用构造方法之前会先调用(构造代码块,成员变量)(括号里面的代码的按照先后顺序执行)
- 总体就是(静态代码块 静态变量)–(构造代码块 成员变量)–(构造方法)
情况二:继承状态下
- 先加载父类的静态代码块或者静态变量,在加载子类的静态代码块和静态变量
- 接着在执行main函数,创建对象的时候,先调用(成员变量,构造代码块),再调用构造方法。但是在main函数中的执行,在每次调用某个类的构造方法以前,一定会先执行(成员变量,构造代码块),括号里面的按照代码出现的先后顺序执行
- (静态代码块,静态变量)–(构造代码块 成员变量 )–构造方法
注意:静态代码块只加载一次。