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
- Python中__init__的用法和理解Python
- k8s-ephemeral和init容器K8S
- Python __new__ 和 __init__ 的區別Python
- 【Android】【init】解析init程式啟動過程Android
- python繼承和重寫init方法--例項Python繼承
- 類中的__init__()和__call__()函式函式
- python中__init__ 和__new__的對比Python
- 一問搞懂python的__init__和__new__方法Python
- git init 命令Git
- __init__.py
- OpenHarmony的init程式、init配置與啟動項配置
- Go init 函式Go函式
- Linux init程式分析Linux
- 2788647047_init_multiprocessing
- Golang init() 函式Golang函式
- (基於Pytorch的深度學習)筆記1:建立模型用到的類:_init_和self、super(Model, self).__init__()PyTorch深度學習筆記模型
- python中的__init__.py檔案和導包總結Python
- Python中__new__和__init__的區別與聯絡Python
- Python面試之理解__new__和__init__的區別Python面試
- Linux基礎命令—initLinux
- git init命令詳解Git
- vue init webpack報錯VueWeb
- Python: __init__.py 作用Python
- Ubuntu移除cloud init元件UbuntuCloud元件
- 理解 go mod init 命令Go
- npx & yarn create & npm initYarnNPM
- 解決ROS國內rosdep init和update的相關問題ROS
- Java面試題:@PostConstruct、init-method和afterPropertiesSet執行順序?Java面試題Struct
- C# 9.0中引入的新特性init和record的使用思考C#
- spring的延遲初始化bean (default-lazy-init 與 lazy-init )SpringBean
- vue 中引用echarts 初始化init undefind問題(Cannot read property ‘init‘ of undefined)VueEchartsUndefined
- vue init webpack-simple 和安裝elementui後 npm run dev報錯VueWebUINPMdev
- 字元裝置驅動學習之cdev_init和cdev_alloc字元dev
- sudo rosdep init 和 rosdep update 報錯的解決方法(簡單有效!)ROS
- Linux基礎命令---init程式Linux
- __new()__ 與 __init()__的區別