java父子类的初始化顺序--我的总结

很难过,昨晚参加了校园宣讲,现场笔试。不幸的是本身没有经过笔试,其中一道选择题是本身以前碰到过不少次可是一直都没有搞明白的。jvm

就是父子类的初始化顺序,好比new一个子类的实例对象,我只知道先执行父类的静态代码和构造函数,在执行子类的静态代码和构造函数。至于,子类的静态代码先执行仍是父类的构造函数先执行本身就搞不清楚了,至于成员变量和代码块的执行顺序更是云里雾里。本身基础仍是太差。下面本身作了一个demo用来强化一下记忆。函数

先添加父类的定义:spa

public class FatherClass {
    public int i=MemberMethod();
    public static int j=StaticMethod();
    {
        System.out.println("父类的代码块1");
    }
    {
        System.out.println("父类的代码块2");
    }
    static{
        System.out.println("父类的静态代码块1");
    }
    static{
        System.out.println("父类的静态代码块2");
    }
    public FatherClass() {
        // TODO Auto-generated constructor stub
        System.out.println("父类的构造函数");
    }
    private static int staticMethod() {
        // TODO Auto-generated method stub
        System.out.println("父类的静态方法");
        return 0;
    }
    private static int StaticMethod() {
        // TODO Auto-generated method stub
        System.out.println("父类的静态成员变量");
        return 0;
    }
    
    private int MemberMethod() {
        // TODO Auto-generated method stub
        System.out.println("父类的成员变量");
        return 0;
    }
}

子类的代码:.net

public class sonClass extends FatherClass{

    public int i=MemberMethod();
    public static int j=StaticMethod();
    {
        System.out.println("子类的代码块1");
    }
    {
        System.out.println("子类的代码块2");
    }
    static{
        System.out.println("子类的静态代码块1");
    }
    static{
        System.out.println("子类的静态代码块2");
    }
    public sonClass() {
        // TODO Auto-generated constructor stub
        System.out.println("子类的构造函数");
    }
    private static int staticMethod() {
        // TODO Auto-generated method stub
        System.out.println("子类的静态方法");
        return 0;
    }
    private static int StaticMethod() {
        // TODO Auto-generated method stub
        System.out.println("子类的静态成员变量");
        return 0;
    }
    
    private int MemberMethod() {
        // TODO Auto-generated method stub
        System.out.println("子类的成员变量");
        return 0;
    }

主方法:code

public class MainClass {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        sonClass son = new sonClass();
        //FatherClass son1 = new sonClass();
    }

}

执行结果:对象

经过结果,能够看到父子类的初始化过程:blog

先从父类的静态成员进行初始化的,静态成员包括静态变量和静态代码块。继承

而后初始化子类的静态成员。get

而后是父类的普通成员变量,包括代码普通成员和代码块。‘it

再而后是父类的构造函数。

最后是子类的普通成员变量和子类的构造函数。

看到这里我才发现,原来子类的构造函数是最后才初始化。并且,父类的成员变量和父类的构造函数初始化顺序是紧挨着的。

固然啦,网上还有比我总结的更详细的大牛,从jvm层面讲解了为何初始化顺序是这样的,我就不盗窃人家的成果了,这里把地址贴出来:

http://www.javashuo.com/article/p-eaosfdtp-mx.html

相关文章
相关标签/搜索