笔者整理java试题的是否发现,很多喜欢考察静态代码块、普通代码块、父子类的初始化顺序,特地在此进行一个整理和归纳,话不多说,我们先上代码
首先给出A类的实现:
public class A {
static {
System.out.println("A static code block");
}
{
System.out.println("A normal code block");
}
public A(){
System.out.println("new A");
}
}
可以看到里面有静态代码块、普通代码块与构造方法,为了区分打印结果我们设置了不同的输出
再提供一个子类B继承A类:下面是B类的实现:
public class B extends A {
public B(){
System.out.println("new B");
}
static{
System.out.println("B static code block");
}
{
System.out.println("B normal code block");
}
public static B b = new B();
public static void main(String[] args) {
B b= new B();
}
}
猜猜看这个代码运行结果是什么呢?
话不多说,我们上答案:
解释:
首先,加载类A和类B,执行静态代码块,因为静态代码块只在类加载时执行一次,所以输出"A static code block"和"B static code block"。
然后,执行类B的静态变量初始化,即public static B b = new B();,这会触发类B的实例化过程。
类B的实例化过程中,首先会初始化父类A,所以执行A的普通代码块和构造函数,输出"A normal code block"和"new A"。
然后,执行类B的普通代码块和构造函数,输出"B normal code block"和"new B"。
最后,在main方法中,再次创建类B的实例,重复上述的实例化过程,输出"A normal code block"、“new A”、“B normal code block"和"new B”。
所以,小伙伴儿们你们晓得这个原理了么?一起加油