最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java類初始化順序詳解

 更新時間:2023年08月14日 09:11:25   作者:不打魔獸的少年  
這篇文章主要介紹了Java類初始化順序詳解,java語言在使用過程中最先開始就是初始化,在工作中如果遇到什么問題需?要定位往往到最后也可能是初始化的問題,因此掌握初始化的順序很重要,需要的朋友可以參考下

Java 類初始化介紹

java語言在使用過程中最先開始就是初始化,在工作中如果遇到什么問題需 要定位往往到最后也可能是初始化的問題,因此掌握初始化的順序很重要。

根據(jù)java 語言特性,本人針對初始化中常遇到的一些關(guān)鍵點做了總結(jié),當(dāng)然是基于代碼之上的,主要針對JVM加載一個類之后,類的屬性等在內(nèi)存中的初始化,主要靜態(tài)的變量和非靜態(tài)的變量,以及靜態(tài)代碼塊,普通代碼塊等。具體參考下面的圖:

這里寫圖片描述

簡單介紹下圖的意思,java類對象初始化主要包括:

  • 靜態(tài)基本變量;
  • 靜態(tài)類變量;
  • 靜態(tài)代碼塊;
  • 普通基本變量;
  • 普通類類型變量;
  • 普通代碼塊;
  • 構(gòu)造方法;

初始化的時候主要就是這些屬性,但是該類繼承自父類,則初始化順序號包括基類的這些屬性,即初始化屬性包括本類的這些屬性+父類的這些屬性,并且基類的屬性和本類的屬性交叉初始化。

無繼承關(guān)系初始化

首先查看基本代碼

首先看TestB.java類

private  static String tag = "TestB";
//靜態(tài)變量
private static int  staticVarA = initVar("staticVarA");
//靜態(tài)代碼塊
static{
    initVar("static init block ");
}
//普通變量
private  int normalA = initVar("normalA");
// 普通代碼塊
{
    initVar("normal init block");
}
public TestB(){
    System.out.println(initVar("constructor"));
}
static int initVar(String str){
    System.out.println(tag +" "+str);
    return 2018;
}

其次是 JavaInitWithMain.java 類

private  static String tag = "JavaInitWithMain";
//靜態(tài)變量
private static int  staticVarA = initVar("staticVarA");
//靜態(tài)代碼塊
static{
    initVar("static init block ");
}
//普通變量
private  int normalA = initVar("normalA");
// 普通代碼塊
{
    initVar("normal init block");
}
private static TestB nB = new TestB();
private TestB nb2 = new TestB();
public JavaInitWithMain(){
    System.out.println(initVar("constructor"));
}
static int initVar(String str){
    System.out.println(tag +" "+str);
    return 2020;
}
public static void main(String[] args) {
    System.out.println("-------main method-------");
    System.out.println("do nothing");
}

接下來是運行結(jié)果:

這里寫圖片描述

結(jié)果分析:

代碼很簡單,分別在2個類中的基本屬性,在JavaInitWithMain 類中的main方法中不做任何操作,查看結(jié)果。

根據(jù)結(jié)果可知,JVM加載了JavaInitWithMain類之后初始化了該類的屬性,順序是 靜態(tài)的—>非靜態(tài)的—->構(gòu)造方法,靜態(tài)的包括靜態(tài)的基本變量,靜態(tài)的類類型變量,靜態(tài)代碼塊,這三個的順序是 程序員的書寫順序。

得出結(jié)論:無繼承關(guān)系時的初始化順序 靜態(tài)屬性(靜態(tài)基本變量,靜態(tài)類類型變量,靜態(tài)代碼塊)—>非靜態(tài)的屬性(基本類型變量,基本類類型變量,基本代碼塊)—>構(gòu)造方法

存在繼承關(guān)系的初始化

類基本不變,增加TestB的子類TheSonofTestB,如下

public class TheSonofTestB extends TestB {
private  static String tag = "TheSonofTestB";
//靜態(tài)變量
private static int  staticVarA = initVar("staticVarA");
//靜態(tài)代碼塊
static{
    initVar("static init block ");
}
//普通變量
private  int normalA = initVar("normalA");
// 普通代碼塊
{
    initVar("normal init block");
}
public TheSonofTestB(){
    System.out.println(initVar("constructor"));
}
static int initVar(String str){
    System.out.println(tag +" "+str);
    return 2019;
}
}

JavaInitWithMain中增加靜態(tài)的屬性,同時為了方便查看去掉了改類中的靜態(tài)類變量和靜態(tài)類類型變量,如下: private static TheSonofTestB sonNB = new TheSonofTestB();

查看 輸出結(jié)果,如下:

同樣分析下結(jié)果: 初始化sonNB 時先去初始化其基類的靜態(tài)屬性,然后初始化TheSonofTestB的靜態(tài)屬性,接下來是父類的基本變量,父類的構(gòu)造,子類的基本變量,最后子類自己的構(gòu)造。

得出結(jié)論: 不管是本類存在繼承還是本類的類對象屬性存在繼承

在初始化時都是: 父類的靜態(tài)屬性—->子類的靜態(tài)屬性—->父類的基本類型屬性—->父類的構(gòu)造—>子類的基本屬性—->子類的構(gòu)造

這里寫圖片描述

寫在最后

最后我想說2點:

1:不管存在不存在繼承,靜態(tài)的屬性—>非靜態(tài)的屬性—->構(gòu)造方法 都是初始化的順序,存在繼承時,依然一樣,只不過父類和子類的這些屬性交替進(jìn)行

2:思考問題: 子類如果覆蓋了父類的靜態(tài)屬性,那么調(diào)用子類的靜態(tài)屬性時,靜態(tài)屬性的值應(yīng)該是什么?子類是靜態(tài)屬性共有幾個?各位可自行試驗

到此這篇關(guān)于Java類初始化順序詳解的文章就介紹到這了,更多相關(guān)Java類初始化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java硬幣翻轉(zhuǎn)倍數(shù)遞增試算實例

    Java硬幣翻轉(zhuǎn)倍數(shù)遞增試算實例

    這篇文章主要介紹了Java硬幣翻轉(zhuǎn)倍數(shù)遞增試算實例,有需要的朋友可以參考一下
    2013-12-12
  • Springboot整合https的實例代碼

    Springboot整合https的實例代碼

    本文簡單介紹了一些密碼學(xué)的基礎(chǔ)和如何通過Springboot整合HTTPS,本文將通過實例代碼給大家詳細(xì)介紹整合過程,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • springBoot詳細(xì)講解使用mybaties案例

    springBoot詳細(xì)講解使用mybaties案例

    MyBatis本是apache的一個開源項目iBatis,2010年這個項目由apache software foundation遷移到了google code,并且改名為MyBatis。2013年11月遷移到Github。iBATIS一詞來源于“internet”和“abatis”的組合,是一個基于Java的持久層框架
    2022-05-05
  • Java異步編程的5種異步實現(xiàn)方式詳解

    Java異步編程的5種異步實現(xiàn)方式詳解

    這篇文章主要介紹了Java異步編程的5種異步實現(xiàn)方式詳解,異步編程是程序并發(fā)運行的一種手段,它允許多個事件同時發(fā)生,當(dāng)程序調(diào)用需要長時間運行的方法時,它不會阻塞當(dāng)前的執(zhí)行流程,程序可以繼續(xù)運行,需要的朋友可以參考下
    2024-01-01
  • java生成隨機(jī)數(shù)的常用方法分析

    java生成隨機(jī)數(shù)的常用方法分析

    這篇文章主要介紹了java生成隨機(jī)數(shù)的常用方法,結(jié)合實例形式分析了java生成隨機(jī)數(shù)常用的方法功能與相關(guān)使用技巧,需要的朋友可以參考下
    2017-10-10
  • Java線程間的通信方式詳解

    Java線程間的通信方式詳解

    這篇文章主要為大家詳細(xì)介紹了Java線程間的通信方式,以代碼結(jié)合文字的方式來討論線程間的通信,感興趣的朋友可以參考一下
    2016-05-05
  • idea導(dǎo)入module全流程

    idea導(dǎo)入module全流程

    這篇文章主要介紹了idea導(dǎo)入module全流程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 關(guān)于StringUtils.isBlank()的使用及說明

    關(guān)于StringUtils.isBlank()的使用及說明

    這篇文章主要介紹了關(guān)于StringUtils.isBlank()的使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • java  interface 接口的使用好處分析

    java interface 接口的使用好處分析

    這篇文章主要介紹了java interface 接口的使用好處,結(jié)合實例形式分析了java interface接口的功能、基本使用方法及多態(tài)性的使用優(yōu)點,需要的朋友可以參考下
    2019-11-11
  • Java收集的雪花算法代碼詳解

    Java收集的雪花算法代碼詳解

    這篇文章主要介紹了Java實現(xiàn)雪花算法的詳細(xì)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10

最新評論

巴里| 德江县| 广河县| 聊城市| 故城县| 安多县| 乌拉特中旗| 淄博市| 大丰市| 安多县| 西城区| 东台市| 新余市| 古浪县| 海口市| 潜江市| 湖北省| 盱眙县| 永靖县| 双牌县| 安溪县| 永胜县| 八宿县| 布拖县| 新野县| 寿光市| 连州市| 乌兰察布市| 阿鲁科尔沁旗| 泸定县| 澳门| 江津市| 南召县| 左贡县| 吉安县| 马边| 昭通市| 越西县| 曲阜市| 固阳县| 汝城县|