java學習(一)靜態代碼塊 構造代碼塊 構造方法的執行順序及注意問題


今天我總結了一下java中靜態代碼塊 構造代碼塊 構造方法的執行順序及其注意問題

首先要知道靜態代碼塊是隨着類的加載而加載,而構造代碼塊和構造方法都是隨着對象的創建而加載

當時做了這么一個小案例(想必這個大多數學java的都做過,不知道是否都理解了)

class Fu{
    static {
        System.out.println("Fu static code");
    }
    {
        System.out.println("Fu code");
    }
    public Fu(){
        System.out.println("Fu GouZao");
    }
}

class Zi extends Fu{
    static {
        System.out.println("Zi static code");
    }
    {
        System.out.println("Zi code");
    }
    public Zi(){
        System.out.println("Zi GouZao");
    }
}

public class Text{
    public static void main(String[] args) {
        Zi zi = new Zi();
    }
}

1,在編譯Text.java時,先加載了Fu類,因此Fu類的靜態代碼塊首先執行,而后加載Zi類,Zi類的靜態代碼塊執行,這沒什么好說的

2,然后創建Zi的對象,大家都知道構造代碼塊優先於構造方法執行,這時候問題來了,這時應該先看Zi類的構造方法,Zi類里的構造方法里有一句隱式的super()首先被執行,所以找到Fu類的構造方法,而Fu類的構造方法中也有一句隱式的super()執行(調用Object類的構造方法),並沒有什么返回結果,接下來才是在執行Fu類構造方法的方法體前先執行了Fu類的構造代碼塊(Fu code),再執行Fu類構造方法的方法體(也就是Fu GouZao),最后又回到Zi類的構造方法中,這時Zi類的super()已經執行完了,在執行Zi類構造方法的方法體前先執行Zi類的構造代碼塊(Zi code),再執行Zi類構造方法的方法體(Zi GouZao)

最后的結果是:

Fu static code
Zi static code
Fu code
Fu GouZao
Zi code
Zi GouZao

不知道大家繞暈了沒有,我在這再總結一下:靜態的是與類有關,肯定先加載,而構造代碼塊執行前要先看構造方法中是否有this()或super(),有的話在其之后執行,最后執行構造方法的方法體

(有理解不對的地方還請大家指點,一起交流探討)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM