测试
代码如下:
public abstract class ADemo1 {
static { System.out.println("static ADemo1 ~~~");
}
{ System.out.println("ADemo1 ~~~"); }
public ADemo1(){ System.out.println("ADemo1 无参构造"); }
public ADemo1(String str){ System.out.println("ADemo1 有参构造"); }
}
public abstract class ADemo2 extends ADemo1{
static { System.out.println("static ADemo2 ~~~"); }
{ System.out.println("ADemo2 ~~~"); }
public ADemo2(){ System.out.println("ADemo2 无参构造"); }
public ADemo2(String str){ System.out.println("ADemo2 有参构造"); }
}
public class ADemo3 extends ADemo2{
static { System.out.println("static ADemo3 ~~~"); }
{ System.out.println("ADemo3 ~~~"); }
public ADemo3(){ System.out.println("ADemo3 无参构造"); }
public ADemo3(String str){ System.out.println("str" + " ADemo3有参构造"); }
}
public class Demo extends ADemo3{
public Demo(String str){ System.out.println("str" + " Demo有参构造"); }
static { System.out.println("static demo"); }
public Demo(){ System.out.println("demo 无参构造"); }
{ System.out.println("Demo"); }
public static void main(String[] args) {
new Demo();
System.out.println("==================
");
new Demo("hello");
}
}
类的继承层级如下:其中ADemo1和ADemo2为抽象类
测试输出结果:
修改Demo类的有参构造方法:
public Demo(String str){
super(str);
System.out.println("str" + " Demo有参构造");
}
测试输出结果:
结论
静态代码块只会调用一次
调用无参构造方法
调用有参构造方法
如果子类有参构造中没有调用父类有参构造:
如果子类有参构造中调用父类有参构造: