类的初始化顺序详解
前言
先聲明一個常識,類域和局部變量初始化的差異如下,
局部變量不初始化會報錯:
類中屬性(也稱域)不賦初值,默認為0,如果是引用默認為空。
正題
一、類中屬性按照定義的順序初始化
我們聲明一個Child類,擁有兩個構造方法:
我們在Main類中創建Child的兩個對象:
輸出結果:
結論:就算類中屬性散亂定義在不同地方,初始化也會嚴格按照先后順序執行。
二、屬性的自初始化先于構造方法初始化
我們知道,構造方法的主要作用在于初始化類中的成員變量,那么它到底何時執行呢?
在這里,我們在構造函數里將child2引用指向了另一個對象:
輸出結果如下:
我們看到,構造函數方法是后被調用的。
結論:構造函數的初始化晚于成員變量自初始化。
三、靜態塊和靜態變量優先
靜態方法又被稱為類方法,靜態屬性被稱為類域,總是最優先初始化。
靜態方法初始化也有兩種方法:
直接初始化
輸出結果:
采用靜態塊統一初始化
輸出結果:
兩種方法效果一樣。但是,注意如果你靜態塊初始,你一定不能這么做:
這樣做你是訪問不了靜態屬性的。
你可以這么理解:靜態塊其實相當于一個屬于靜態屬性的初始化函數,你就算在里面定義了變量,作用周期也括號范圍內。所以,你的正確做法是:在外面定義好靜態類型的引用而統一在靜態塊中初始化。
結論:一個類中初始化順序是:靜態->類屬性->構造函數。
四、繼承關系中的初始化順序
我們增加一個Parent類:
然后讓Child繼承Paret類,并給Child增加一個靜態塊:
使用Main類調用Child:
結果:
我們可以看到:Parent和Child的靜態塊先被調用,之后按照先父類后子類的順序進行了初始化,而且靜態屬性只初始化一次。
結論:擁有繼承關系時,先是從父類到子類初始化靜態屬性,之后再是從父類到子類初始化非靜態屬性。
總結
轉載于:https://www.cnblogs.com/gujiewei/p/9670573.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: JavaScript实现表单验证功能
- 下一篇: cfe刷机教程 斐讯k3_2019斐讯K