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

相關文章
相關標籤/搜索