Java 程序初始化順序
Java程序的初始化一般遵循三個(gè)原則(優(yōu)先級(jí)依次遞減):
- 1,靜態(tài)對象(變量)優(yōu)先于非靜態(tài)對象(變量)初始化,其中,靜態(tài)對象(變量)只初始化一次,而非靜態(tài)對象(變量)可能會(huì)初始化很多次。
- 2,父類優(yōu)先于子類進(jìn)行初始化。
- 3,按照成員變量的定義順序進(jìn)行初始化。即使變量定義散布于方法定義之中,它們依然在任何方法被調(diào)用之前先初始化。
Java程序初始化工作可以在許多不同的代碼塊中完成(例如靜態(tài)代碼塊,構(gòu)造函數(shù)等),它們的執(zhí)行順序如下:
- 父類靜態(tài)變量
- 父類靜態(tài)代碼塊
- 子類靜態(tài)變量
- 子類靜態(tài)代碼塊
- 父類非靜態(tài)變量
- 父類非靜態(tài)代碼塊
- 父類構(gòu)造函數(shù)
- 子類非靜態(tài)變量
- 子類非靜態(tài)代碼塊
- 子類構(gòu)造函數(shù)。
下面給出一個(gè)不同模塊初始化時(shí)執(zhí)行順序的一個(gè)例子:
class Base{
? ? ? ? ? ?static {
? ? ? ? ? ? ? ? System.out.println("Base static block");
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ?public Base(){
? ? ? ? ? ?System.out.println("Base constructor");
? ? ? ? ? ?}
?public class Derived extends Base{
? ? ? ? ? ?static{
? ? ? ? ? System.out.println("Drevied static block");
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? {
? ? ? ? ? System.out.println("Drevied ?block");
? ? ? ? ? ?}
?public ?Derived(){
? ? ? ? ? System.out.println("Drevied ?constructor");
? ? ? ? ? }
public static void main(String args[]){
? ? ? ? ? ? ? ? new Derived();
? ? ? ? ? }
? ? ? ? ? }先自己利用上面給出的執(zhí)行順序進(jìn)行判斷:
程序的運(yùn)行結(jié)果為:
Base static block
Derived static block
Base block
Base constructor
Derived block
Derived constructor
怎么樣,運(yùn)行結(jié)果是否與你的結(jié)果一致呢?
最后,我們再來看一道面試真題:
下列代碼運(yùn)行結(jié)果是什么?
? class B extends Object{
? ? ? ? ? static{
? ? ? ? ? System.out.println("Load B1");
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ?public ?B(){
? ? ? ? ? System.out.println("Create B");
? ? ? ? ? }
? ? ? ? ? ?static{
? ? ? ? ? System.out.println("Load B2");
? ? ? ? ? ?}
? ? ? ? ? ?}
class A extends B{
? ? ? ? ? static{
? ? ? ? ? System.out.println("Load A");
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ?public ?A(){
? ? ? ? ? System.out.println("Create A");
? ? ? ? ? }
? ? ? ? ? }
? ? ? ? ? public class Testclass{
? ? ? ? ? public static void main(String[ ] args){
? ? ? ? ? ? ? ? ? ? ? ? new A();
? ? ? ? ? }
? ? ? ? ? }運(yùn)行結(jié)果是:
Load B1 LoadB2 Load A Create B Create A
在面試中出現(xiàn)的執(zhí)行順序的問題,無非也就是把上面的代碼再換幾個(gè)形式,但,萬變不離其宗,只要掌握它的執(zhí)行順序的規(guī)律,所有問題就都可以迎刃而解了
到此這篇關(guān)于Java 程序初始化順序的文章就介紹到這了,更多相關(guān)Java程序初始化順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java service層獲取HttpServletRequest工具類的方法
今天小編就為大家分享一篇關(guān)于Java service層獲取HttpServletRequest工具類的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12
Java通過SSM完成水果商城批發(fā)平臺(tái)流程
這是一個(gè)使用了java+SSM開發(fā)的網(wǎng)上水果商城批發(fā)平臺(tái),是一個(gè)實(shí)戰(zhàn)小練習(xí),具有水果商城批發(fā)該有的所有功能,感興趣的朋友快來看看吧2022-06-06
SpringBoot整合OpenCV的實(shí)現(xiàn)示例
這篇文章主要介紹了SpringBoot整合OpenCV的實(shí)現(xiàn)示例。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
spring-data-redis自定義實(shí)現(xiàn)看門狗機(jī)制
redission看門狗機(jī)制是解決分布式鎖的續(xù)約問題,本文主要介紹了spring-data-redis自定義實(shí)現(xiàn)看門狗機(jī)制,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
java中hashmap容量的初始化實(shí)現(xiàn)
這篇文章主要介紹了java中hashmap容量的初始化實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Java精品項(xiàng)目瑞吉外賣之新增菜品與分頁查詢篇
這篇文章主要為大家詳細(xì)介紹了java精品項(xiàng)目-瑞吉外賣訂餐系統(tǒng),此項(xiàng)目過大,分為多章獨(dú)立講解,本篇內(nèi)容為新增菜品和分頁查詢功能的實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05

