类的初始化顺序
静态变量 -> 静态初始化块 -> 变量 -> 初始化块 -> 构造函数
测试代码
public class ObjectInit {
//静态变量
public static final StaticField STATIC_FIELD = new StaticField();
//静态初始化块
static{
System.out.println("静态初始化块");
}
//变量
private String field = "变量";
//初始化块
{
System.out.println(field);
System.out.println("初始化块");
}
//构造函数
public ObjectInit(){
System.out.println("构造函数");
}
public static void main(String[] ages){
new ObjectInit();
}
}
还重定义的静态变量的类
public class StaticField {
public StaticField(){
System.out.println("StaticField controctor");
}
@Override
public String toString() {
return "StaticField controctor";
}
}
执行结果
StaticField controctor
静态初始化块
变量
初始化块
构造函数
当继承父类时的执行顺序是怎样的呢
父类代码:
public class Parent {
//静态变量
public static final StaticField PARENT_STATIC_FIELD = new StaticField("父类 静态变量");
//静态初始化块
static{
System.out.println("父类 静态初始化块");
}
//变量
private StaticField field = new StaticField("父类 变量");
//初始化块
{
System.out.println("父类 初始化块");
}
//构造函数
public Parent(){
System.out.println("父类 构造函数");
}
}
子类代码:
public class Child extends Parent {
//静态变量
public static final StaticField CHILD_STATIC_FIELD = new StaticField("子类 静态变量 ");
//静态初始化块
static{
System.out.println("子类 静态初始化块");
}
//变量
private StaticField field = new StaticField("子类 变量");
//初始化块
{
System.out.println("子类 初始化块");
}
//构造函数
public Child(){
System.out.println("子类 构造函数");
}
public static void main(String[] agrs){
new Child();
}
}
辅助类
public class StaticField {
public StaticField(){
System.out.println("StaticField controctor");
}
public StaticField(String name){
System.out.println(name);
}
@Override
public String toString() {
return "StaticField controctor";
}
}
最后执行结果,很清晰看到继承的初始化顺序
父类 静态变量
父类 静态初始化块
子类 静态变量
子类 静态初始化块
父类 变量
父类 初始化块
父类 构造函数
子类 变量
子类 初始化块
子类 构造函数