Java各种成员初始化顺序

Posted qiezijiajia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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各种成员初始化顺序的主要内容,如果未能解决你的问题,请参考以下文章

Java类成员初始化顺序

java 静态代码块 代码块 构造函数 静态成员变量 成员变量的初始化顺序

Java类中各个成员初始化顺序

Java类的静态成员静态代码块普通成员普通代码块构造方法初始化执行的顺序

一文详解:Java中父子类静态块构造块构造方法成员变量之间的初始化先后顺序与执行先后顺序

java中成员变量代码块构造函数运行顺序