看这个例子就清楚了。记得收藏起来,忘记了可以拿出来看看
例子里总共测试了基类静态代码块,基类普通代码块,基类静态成员变量,基类普通成员变量,基类构造器,
子类静态代码块,子类普通代码块,子类静态成员变量,子类普通成员变量,子类的构造器,在子类的实例化时的顺序:
例子
class Log{
public static String baseFieldInit() {System.out.println("Base Normal Field");return "";}
public static String baseStaticFieldInit() {System.out.println("Base Static Field");return "";}
public static String fieldInit() {System.out.println("Normal Field");return "";}
public static String staticFieldInit() {System.out.println("static Field");return "";}
}
class Base {
//基类静态代码块
static {System.out.println("Base Static Block1");}
//基类静态变量
private static String staticValueString = Log.staticFieldInit();
static {System.out.println("Base Static Block2");}
//普通代码码
{System.out.println("Base Normal Block 1");}
//普通成员变量
private String value = Log.baseFieldInit();
{System.out.println("Base Normal Block 2");}
//基类构造器
Base(){System.out.println("Base Constructor");}
}
public class Derived extends Base{
//子类静态代码块
static {System.out.println("Static Block 1");}
//子类静态成员变量
private static String staticValueString=Log.staticFieldInit();
static {System.out.println("Static Block 2");}
//子类普通代码块
{System.out.println("Normal Block 1");}
//子类普通成员变量
private String value=Log.fieldInit();
{System.out.println("Normal Block 2");}
//子类构造器
public Derived() {
System.out.println("Deriver Constructor");
}
public static void main(String[] args) {
Derived deriver = new Derived();
}
}
实验输出结果:
Base Static Block1
static Field
Base Static Block2
Static Block 1
static Field
Static Block 2
Base Normal Block 1
Base Normal Field
Base Normal Block 2
Base Constructor
Normal Block 1
Normal Field
Normal Block 2
Deriver Constructor
上面例子证明:
子类对象实例化的时候的顺序是这样的:
1.基类静态代码块,基类静态成员字段(并列优先级,按代码中出现先后顺序执行)(只有第一次加载类时执行)
2.派生类静态代码块,派生类静态成员字段(并例优先级,按代码中出现先后顺序执行)
3.基类普通代码块,基类普通成员字段(并列优先级,按代码中出现先后顺序执行)
4.基类构造函数
5.派生类普通代码块,派生类普通成员字段(并列优先级,按代码中出现先后顺序执行)
6。派生类构造函数 。