clinit和init
<clinit>方法是類構造器方法,只對類方法(static域和static程式碼塊)進行初始化,<clinit>方法是在:載入->連結->初始化的初始化階段進行的。Java在編譯之後會在位元組碼檔案中生成<clinit>方法,將靜態域和靜態程式碼塊收斂到<clinit>方法中,收斂順序為:
- 父類靜態變數初始化(預設值0或null)
- 父類靜態語句塊初始化
- 子類靜態變數初始化
- 子類靜態語句塊初始化
<init>方法是例項構造器,在物件被建立(new)時,進行例項化操作的方法。並且子類的<init>方法會首先呼叫父類的<init>方法(即在constructor中首先呼叫super)。Java在編譯之後會在位元組碼檔案中生成<init>方法,該例項構造器會將變數,語句塊初始化,呼叫父類的構造器等操作收斂到<init>方法中,收斂順序為:
- 父類變數初始化(這裡的初始化,就是賦予預設值)
- 父類語句塊初始化
- 父類建構函式(賦予變數使用者值)
- 子類變數初始化
- 子類語句塊初始化
- 子類建構函式
<clinit>方法的的執行時間一定早於<init>,因為<clinit>方法是在類初始化過程中執行的,而<init>方法是在物件例項化時執行的。
所以,整個順序就是:
- 父類靜態變數初始化
- 父類靜態語句塊初始化
- 子類靜態變數初始化
- 子類靜態語句塊初始化
- 父類變數初始化(初始化非靜態成員變數(賦予預設值))
- 父類語句塊初始化
- 父類建構函式(建構函式中賦值(變數使用者值))
- 子類變數初始化
- 子類語句塊初始化
- 子類建構函式
相關文章
- [JVM]<clinit>和<init>JVM
- 50-cloud-init.yaml 和80-cloud-init.yaml區別CloudYAML
- spring中的default-lazy-init引數和lazy-initSpring
- Python__new__和__init__Python
- __new__和__init__的區別
- Init
- Python中__init__的用法和理解Python
- reboot和init 6之間的區別boot
- python繼承和重寫init方法Python繼承
- Boot, Init和Shutdown 過程的描述(轉)boot
- init sys
- k8s-ephemeral和init容器K8S
- Python __new__ 和 __init__ 的區別Python
- 類中的__init__()和__call__()函式函式
- context-param和init-param區別Context
- 【Android】【init】解析init程式啟動過程Android
- git init 命令Git
- ora_init
- __init__.py
- python中__init__ 和__new__的對比Python
- python繼承和重寫init方法--例項Python繼承
- 詳解Python中的__init__和__new__Python
- python類中super()和__init__()的區別Python
- OpenHarmony的init程式、init配置與啟動項配置
- 一問搞懂python的__init__和__new__方法Python
- Android系統啟動:init程式與init語言Android
- Go init 函式Go函式
- Golang init() 函式Golang函式
- 47.6.Init.dScript
- OC alloc、init、new
- 10.2.0.2 init parameter
- Python面試之理解__new__和__init__的區別Python面試
- (基於Pytorch的深度學習)筆記1:建立模型用到的類:_init_和self、super(Model, self).__init__()PyTorch深度學習筆記模型
- Linux init程式分析Linux
- git init命令詳解Git
- npx & yarn create & npm initYarnNPM
- 系統啟動, init
- vue init webpack報錯VueWeb