Java类加载机制中最重要的就是程序初始化过程,其中包含了静态资源,非静态资源,父类子类,构造方法之间的执行顺序。这类知识经常会出现在面试题中,如果没有搞清楚其原理,在复杂的开源设计中可能无法梳理其业务流程,是java程序员进阶的阻碍。
public class CodeBlockForJava extends BaseCodeBlock {
{
System.out.println("这里是子类的普通代码块");
}
public CodeBlockForJava() {
System.out.println("这里是子类的构造方法");
}
@Override
public void msg() {
System.out.println("这里是子类的普通方法");
}
public static void msg2() {
System.out.println("这里是子类的静态方法");
}
static {
System.out.println("这里是子类的静态代码块");
}
public static void main(String[] args) {
BaseCodeBlock bcb = new CodeBlockForJava();
bcb.msg();
}
Other o = new Other();
}
class BaseCodeBlock {
public BaseCodeBlock() {
System.out.println("这里是父类的构造方法");
}
public void msg() {
System.out.println("这里是父类的普通方法");
}
public static void msg2() {
System.out.println("这里是父类的静态方法");
}
static {
System.out.println("这里是父类的静态代码块");
}
Other2 o2 = new Other2();
{
System.out.println("这里是父类的普通代码块");
}
}
class Other {
Other() {
System.out.println("初始化子类的属性值");
}
}
class Other2 {
Other2() {
System.out.println("初始化父类的属性值");
}
}
运行结果:
注意的是类的属性与非静态代码块的执行级别是一样的,谁先执行取决于书写的先后顺序。
结论1:父类的静态代码块->子类的静态代码块->初始化父类的属性值/父类的普通代码块(自上而下的顺序排列)->父类的构造方法->初始化子类的属性值/子类的普通代码块(自上而下的顺序排列)->子类的构造方法。