在面试中经常会被考到类的初始化顺序相关的问题,老是回答不完善,所以在此进行一个实战并且备个份,供以后查阅。
试验环境说明:
会用到如下几个类:
Father(父类)
Son(子类,继承Father类)
Main(程序入口类)
开始实践
一:Father类和Son类仅仅有一个无参构造器,并且Son继承Father
代码详情:
Father类:
package _01;
/**
* Created by FengLian on 2017/7/22.
*/
public class Father {
public Father() {
System.out.println("father inited");
}
}
Son类:
package _01;
/**
* Created by FengLian on 2017/7/22.
*/
public class Son extends Father {
public Son() {
System.out.println("son inited");
}
}
Main类:
package _01;
public class Main {
public Main() {
System.out.println("Main inited");
}
public static void main(String[] args) {
Son son = new Son();
}
}
执行结果
father inited
son inited
小结:
由结果可见,如果在初始化一个类时,该类有继承的父类,则先执行父类的构造函数,然后在执行自己的构造函数,并且执行Main类的main函数时,没有指向其构造函数。
二:Father类、Son类、Main类都有自己的静态代码块
代码详情
Father类:
package _02;
public class Father {
static{
System.out.println("father static");
}
public Father() {
System.out.println("father inited");
}
}
Son类:
package _02;
public class Son extends Father {
static{
System.out.println("son static");
}
public Son() {
System.out.println("son inited");
}
}
Main类:
package _02;
public class Main {
static{
System.out.println("Main static");
}
public Main() {
System.out.println("Main inited");
}
public static void main(String[] args) {
Son son = new Son();
}
}
执行结果:
Main static
father static
son static
father inited
son inited
小结:
这个结果显示了,优先会执行所有类的静态代码块,并且是从Main类的静态代码块开始,然后是Father类的静态代码块,然后才是Son类的静态代码块(可见静态代码块的执行时是先父类,然后按照继承关系才是执行子类的静态代码块),然后的执行结果和实例一一样。
三:其他保持和实例二不变,只对Main进行简单修改:
代码详情:
package _02;
public class Main {
static{
System.out.println("Main static");
}
public Main() {
System.out.println("Main inited");
}
public static void main(String[] args) {
Son son = new Son();
Son son2 = new Son();
}
}
执行结果:
Main static
asor static
father static
son static
father inited
son inited
father inited
son inited
小结:
根据结果我们知道了,静态代码块的只会执行一次。