static及類的加載初始化、對象初始化的順序。


static用來修飾靜態的變量、方法、(靜態內部類)

被static修飾的元素所有對象僅此一份,存儲在方法區。

被static修飾的屬性在類加載的時候就初始化好了。

被static修飾的方法和屬性可以直接使用類名.方法名/屬性名調用

一般用於對象之間共享數據吧。

靜態方法中只能使用靜態變量,它內部也沒有this引用,因為它不屬於任何一個對象。

只能使用靜態變量的原因是,可能使用方法時實例變量還沒有初始化好

static方法必須被實現,不能是抽象的。

static代碼塊,被用來初始化static變量或者執行某些特定的方法,只會在類加載的時候執行一次。

 

感覺static沒什么。可以理解為,被static修飾的所有東西都是屬於類的,只有這一份的,重點關注以下static代碼塊,在類加載的時候比較重要。因為,它和類加載有關系哈

對象初始化的順序:

  首先是類加載,類加載的過程中為靜態變量初始化,以及載入靜態方法(先加載父類,再加載子類)

  其次是調用static代碼塊,static代碼塊的作用是為靜態變量賦值,可以調用靜態方法(先調用父類的,再調用子類的)

  然后是初始化對象,先執行非靜態代碼塊,再執行構造函數(也是先調用父類的再調用子類的)

 

在這三個過程中,並不是說一次性把父類的所有的初始化方式一次性執行完,而是把所有的對象初始化,分為了這三個階段。

但是第一步和第二步只會執行一次,被反復執行的是第三步。

其實可以分為兩個階段會好理解一點吧;

第一個階段是類加載及初始化:

先加載父類,再加載子類

首先把所有的類加載進來之后,從父類開始依次向下的初始化類變量。(初始化變量意思是指的,將變量的值設置為程序中所直接 int a = 10,這樣的常量。就直接變為10,如果沒有寫明的話,初始化為零值)

第二個階段是對象初始化;:

(執行靜態代碼塊,從父類到子類,不顧哦這個過程在程序運行時期只會執行一次,執行的時刻是在new這個類的對象之前的時候執行static代碼塊,並不是在類的加載之后又立馬執行)

對象初始化的話,也是從父類開始初始化,父類初始化完成之后再初始化子類。(先執行父類的非static代碼塊,然后構造函數,然后子類的非static代碼塊,構造函數)

這樣就好理解一點啦。

 


免責聲明!

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



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