class a{
static String abc="123";
static {
System.out.println("I am a");
}
{
System. out .println( "这是父类的构造代码块" );
}
public a() {
System.out.println("这是a的无参构造函数");
}
}
class b extends a{
int ccc;
static {
System.out.println("I am b");
}
public b(int ccc) {
this.ccc=ccc;
System.out.println("这是b的构造函数");
}
public b() {
System.out.println("这是b的无参构造函数");
}
{
System. out .println( "这是子类的构造代码块" );
}
}
class Solution {
public static void main(String[] args) {
b bb=new b(5);
System.out.println(bb.abc);
b bc=new b();
System.out.println(bc.abc);
}
}
运行结果:
I am a
I am b
这是父类的构造代码块
这是a的无参构造函数
这是子类的构造代码块
这是b的构造函数
123
这是父类的构造代码块
这是a的无参构造函数
这是子类的构造代码块
这是b的无参构造函数
123
总结:首先执行静态代码块(父类->子类),仅在类被加载时执行且仅被执行一次;
然后执行父类的构造代码块和构造函数,之后执行子类的构造代码块和构造函数。每创建一个实例,这些构造代码块和构造函数就会被执行一次。