Java语言基础

对象的初始化顺序

2017-12-16  本文已影响10人  SHAN某人

分析代码来源:胖胖-对象初始化顺序

 /**
     *    控制台打印
     */
    class Log{
        public static String baseFieldInit(){System.out.println("父类非静态变量");return "";}

        public static String baseStaticFieldInit(){System.out.println("父类静态变量");return "";}

        public static String fieldInit(){System.out.println("子类非静态变量");return "";}

        public static String staticFieldInit(){System.out.println("子类静态变量");return "";}
    }
    /**
     *  基类
     */
    class Base {
        /*1*/ private static String staticValue=Log.baseStaticFieldInit();

        /*1*/ static {System.out.println("父类静态代码块");}

        /*1*/ static {System.out.println("父类静态代码块2");}

        /*3*/ {System.out.println("父类非静态代码块1");}

        /*3*/ private String value=Log.baseFieldInit();

        /*3*/ {System.out.println("父类非静态代码块2");}

        /*4*/ Base(){System.out.println("父类构造方法");}
    }
/**
 *  派生类
 */
public class Derived extends Base{

    /*2*/ static {System.out.println("子类静态代码块1");}

    /*2*/ private static String staticValue=Log.staticFieldInit();

    /*2*/ static {System.out.println("子类静态代码块2");}

    /*5*/ {System.out.println("子类非静态代码块1");}

    /*5*/ private String value=Log.fieldInit();

    /*5*/ {System.out.println("子类非静态代码块2");}

    /*6*/ Derived(){System.out.println("子类构造方法");}

    /**
     *  MAIN 主线程
     */
    public static void main(String[] args){
        Derived d=new Derived();
    }

}
执行结果

结论:

一个误解

首先指出初始化顺序不一定严格按照以上顺序进行,如果静态代码块写在静态变量之前,则先执行静态代码块。

总之,规律是执行的顺序严格按照先静态再非静态再构造方法,先父类后子类的顺序进行。

父类静态(变量或代码块,编写顺序为执行顺序)-->子类静态-->父类非静态-->父类构造-->子类非静态-->子类构造

上一篇下一篇

猜你喜欢

热点阅读