首页 > 代码库 > Java各种成员初始化顺序

Java各种成员初始化顺序

在其他博客看到过这种关于初始化顺序的文章,仔细一想,自己还真的不太清楚具体的顺序是什么样的,搞段代码测试一下:

class B extends A ,然后A类也就是父类里面有静态代码块,普通代码块,静态方法,静态成员变量,普通成员变量,普通方法。


public class LoaderOrderParent {

    static{

        System.out.println("父类--静态代码块");
    }
    {

        System.out.println("父类--代码块");
    }

    public static String staticStringParent=initStaticStringInParent();

    public String stringInParent=initStringInParent();

    public LoaderOrderParent(){

        System.out.println("父类--构造方法");
    }

    public static String initStaticStringInParent(){

        System.out.println("父类--初始化静态变量");
        return "initStaticStringInParent";
    }

    public String initStringInParent(){

        System.out.println("父类--初始化普通变量");
        return "initStringInParent";
    }
}



public class LoaderOrderChild extends LoaderOrderParent {

    public String stringInChild=initStringInChild();
    public static String staticStringInChild=initStaticStringInChild();
    {

        System.out.println("子类--方法块");
    }
    static {

        System.out.println("子类--静态方法块");
    }

    public LoaderOrderChild(){

        System.out.println("子类--构造方法");
    }

    public static String initStaticStringInChild(){

        System.out.println("子类--初始化静态变量");
        return "staticStringInChild";
    }

    public String initStringInChild(){

        System.out.println("子类--初始化普通变量");
        return "stringInChild";
    }


    public static void main(String[] args){

        new LoaderOrderChild();
    }
}

在子类中,执行main方法,new LoaderOrderChild();

 

输出结果为:

父类--静态代码块
父类--初始化静态变量
子类--初始化静态变量
子类--静态方法块
父类--代码块
父类--初始化普通变量
父类--构造方法
子类--初始化普通变量
子类--方法块
子类--构造方法

 

虽然子类的普通代码块写在静态代码块前面,但是还是静态代码库先执行

Java各种成员初始化顺序