package com.fjf.test.classloadoreder;
/**
*
*
*参考:https://blog.csdn.net/anticlql/article/details/74011018 (自己做了点修改)
* 测试类加载的顺序
* @author fjf
* 2018年8月28日 11:07:16
*
*
若类还未被加载
1. 先执行父类的静态代码块和静态变量初始化,并且静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。
2. 执行子类的静态代码块和静态变量初始化。
3. 执行父类的实例变量初始化
4. 执行父类的构造函数
5. 执行子类的实例变量初始化
6. 执行子类的构造函数
若类已经加载
则静态代码块和静态变量就不用重复执行,再创建类对象时,只执行与实例相关的变量初始化和构造方法
*
*
* :静态块(静态变量)→成员变量→构造方法
*
*/
“`
class ClassA{
static{
System.out.println(“In ClassA Static”);
}
public ClassA(){
System.out.println(“ClassA()”);
}
}
class ClassB{
static{
System.out.println("In ClassB Static");
}
ClassB1 b1 = new ClassB1();
public ClassB(){
System.out.println("ClassB()");
}
}
class ClassC extends ClassB{
static{
System.out.println("In ClassC Static");
}
ClassC1 c1 = new ClassC1();
public ClassC(){
System.out.println("ClassC()");
}
}
class MyCLasss{
static ClassA ca = new ClassA();
ClassC cc = new ClassC();
static{
System.out.println("In MyCLasss Static");
}
public MyCLasss(){
System.out.println("MyCLasss()");
}
}
class ClassB1{
public ClassB1(){
System.out.println("ClassB1()");
}
}
class ClassC1{
public ClassC1(){
System.out.println("ClassC1()");
}
}
public class TestMain {
public static void main(String[] args){
MyCLasss mc1 = new MyCLasss();
System.out.println("-------------------");
MyCLasss mc2 = new MyCLasss();
}
}
“`————————————
运行结果:
可先自己推演一边 再对下执行结果: