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

Java初始化塊及執(zhí)行過程解析

 更新時間:2019年09月17日 10:19:12   作者:冰湖一角  
這篇文章主要介紹了Java初始化塊及執(zhí)行過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

問題:Java對象初始化方式主要有哪幾種?分別是什么?

針對上面的問題,想必大家腦海中首先浮現(xiàn)出的答案是構(gòu)造器,沒錯,構(gòu)造器是Java中常用的對象初始化方式。

還有一種與構(gòu)造器作用非常相似的是初始化塊,它可以對Java對象進行初始化操作。下面主要闡述Java的初始化塊及執(zhí)行過程。

Java初始化塊其實是Java類的成員之一,其語法格式如下:

[修飾符]{

  //初始化塊的可執(zhí)行代碼

  ...

}

初始化塊的修飾符只能是static,使用static修飾符的初始化塊稱為靜態(tài)初始化塊,后面會介紹到。

下面通過一段程序代碼看看創(chuàng)建對象Dog時發(fā)生了什么。

public class Dog {
  //定義一個初始化塊
  {
    System.out.println("第一個初始化塊");
  }
  //定義第二個初始化塊
  {
    System.out.println("第二個初始化塊");
  }
  //定義無參的構(gòu)造器
  public Dog() {
    System.out.println("Dog的無參構(gòu)造器");
  }  
  public static void main(String[] args) {    
    new Dog();
  }
}

運行結(jié)果為:

第一個初始化塊
第二個初始化塊
Dog的無參構(gòu)造器

從運行結(jié)果可以看出:當創(chuàng)建一個Dog對象時,程序先執(zhí)行初始化塊后執(zhí)行構(gòu)造器,而且兩個初始化的執(zhí)行順序是按照前后順序執(zhí)行的。

由于初始化塊只在創(chuàng)建Java對象時隱士的執(zhí)行(所有的初始化塊全部執(zhí)行),為了讓程序更加的簡潔和可讀性更強,一般一個類里最多只有一個初始化塊。

既然初始化塊和構(gòu)造器都是創(chuàng)建對象的時候執(zhí)行,那么它們有什么區(qū)別呢?

從某種程度上來看,初始化塊是構(gòu)造器的補充,與構(gòu)造器不同的是,初始化塊是一段固定執(zhí)行的代碼,不能接收任何的參數(shù),而構(gòu)造器是可以接收參數(shù)的。如果程序中有兩個構(gòu)造器,并且它們有公共的無需接收參數(shù)的代碼,則可以把這些相同的公共代碼放到初始化塊中,提高代碼的可維護性。

當普通初始化塊被static修飾時,則這個初始化塊就是靜態(tài)初始化塊,也被稱為類初始化塊。

普通初始化塊負責對對象進行初始化,而靜態(tài)初始化塊負責對類進行初始化,所以靜態(tài)初始化塊總是比普通初始化塊先執(zhí)行。

靜態(tài)初始化塊通常用于對類變量執(zhí)行初始化處理,不能對實例變量進行初始化處理。

靜態(tài)初始化塊也是類的靜態(tài)成員,仍然需要遵循靜態(tài)成員不能訪問非靜態(tài)成員的規(guī)則,包括不能訪問實例變量和實例方法。

初始化塊執(zhí)行的時候會一直上溯到j(luò)ava.lang.Object類,先執(zhí)行Object的初始化塊,再執(zhí)行其父類的初始化塊...最后才執(zhí)行該類自己的初始化塊。

下面看下這段代碼的執(zhí)行順序結(jié)果:

class Biology{
  static {
    System.out.println("Biology的靜態(tài)初始化塊");
  }
  {
    System.out.println("Biology的普通初始化塊");
  }
  public Biology(){
    System.out.println("Biology的無參構(gòu)造器");
  }
}
class Animal extends Biology{
  static {
    System.out.println("Animal的靜態(tài)初始化塊");
  }
  {
    System.out.println("Animal的普通初始化塊");
  }
  public Animal(){
    System.out.println("Animal的無參構(gòu)造器");
  }
  public Animal(String name){
    this();//調(diào)用同類中的重載構(gòu)造器
    System.out.println("Animal的帶參構(gòu)造器,name="+name);
  }
}
class Cat extends Animal{
  static {
    System.out.println("Cat的靜態(tài)初始化塊");
  }
  {
    System.out.println("Cat的普通初始化塊");
  }
  public Cat(){
    //調(diào)用父類中帶參數(shù)的構(gòu)造器
    super("Java典籍");
    System.out.println("Cat的無參構(gòu)造器");
  }
}
public class Test {
  public static void main(String[] args) {
    new Cat();
    System.out.println("=========");
    new Cat();
  }
}

執(zhí)行結(jié)果如下:

Biology的靜態(tài)初始化塊
Animal的靜態(tài)初始化塊
Cat的靜態(tài)初始化塊
Biology的普通初始化塊
Biology的無參構(gòu)造器
Animal的普通初始化塊
Animal的無參構(gòu)造器
Animal的帶參構(gòu)造器,name=Java典籍
Cat的普通初始化塊
Cat的無參構(gòu)造器
=========
Biology的普通初始化塊
Biology的無參構(gòu)造器
Animal的普通初始化塊
Animal的無參構(gòu)造器
Animal的帶參構(gòu)造器,name=Java典籍
Cat的普通初始化塊
Cat的無參構(gòu)造器

從上面的執(zhí)行結(jié)果來看,第一次創(chuàng)建Cat對象時,由于系統(tǒng)還未有Cat對象,因此需要先加載并初始化Cat類,初始化Cat類會先執(zhí)行其頂層父類的靜態(tài)初始化塊,再執(zhí)行其直接父類的靜態(tài)初始化塊,最后才執(zhí)行其本身的靜態(tài)初始化塊。

一旦Cat類初始化成功后,其在虛擬機中一直存在,當?shù)诙卧賱?chuàng)建Cat對象時 無需再對Cat類進行初始化。

綜上,一個類初始化的執(zhí)行順序為:父類靜態(tài)初始化塊,該類靜態(tài)初始化塊,父類普通初始化塊,父類構(gòu)造器,該類普通初始化塊,該類構(gòu)造器。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中的運算符你知道多少

    Java中的運算符你知道多少

    這篇文章主要為大家詳細介紹了Java中的運算符,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • SpringBoot框架中Mybatis-plus的簡單使用操作匯總

    SpringBoot框架中Mybatis-plus的簡單使用操作匯總

    這篇文章主要介紹了SpringBoot框架中Mybatis-plus的簡單使用,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • Spring boot啟動流程之解決循環(huán)依賴的方法

    Spring boot啟動流程之解決循環(huán)依賴的方法

    循環(huán)依賴,指的是兩個bean之間相互依賴,形成了一個循環(huán),spring解決循環(huán)依賴的方式是在bean的實例化完成之后,所以不要在構(gòu)造方法中引入循環(huán)依賴,因為這時對象還沒有實例化,spring也無法解決,本文給大家介紹Spring boot循環(huán)依賴的解決方法,一起看看吧
    2024-02-02
  • 可能是全網(wǎng)最詳細的springboot整合minio教程

    可能是全網(wǎng)最詳細的springboot整合minio教程

    MinIO是全球領(lǐng)先的對象存儲先鋒,在標準硬件上,讀/寫速度上高達183 GB/秒和171 GB/秒,下面這篇文章主要給大家介紹了關(guān)于springboot整合minio的相關(guān)資料,這個教程可能是全網(wǎng)最詳細的,需要的朋友可以參考下
    2022-06-06
  • Mybatis實體類對象入?yún)⒉樵兊墓P記

    Mybatis實體類對象入?yún)⒉樵兊墓P記

    這篇文章主要介紹了Mybatis實體類對象入?yún)⒉樵兊墓P記,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 深入理解Java虛擬機 JVM 內(nèi)存結(jié)構(gòu)

    深入理解Java虛擬機 JVM 內(nèi)存結(jié)構(gòu)

    本節(jié)將會介紹一下JVM的內(nèi)存結(jié)構(gòu),JVM運行時數(shù)據(jù)區(qū)的各個組成部分:堆,方法區(qū),程序計數(shù)器,Java虛擬機棧,本地方法棧,還會對Java堆的分代劃分做個簡單的介紹
    2021-09-09
  • Java處理延時任務(wù)的常用幾種解決方案

    Java處理延時任務(wù)的常用幾種解決方案

    本文主要介紹了Java處理延時任務(wù)的常用幾種解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • Java實現(xiàn)漢字轉(zhuǎn)全拼音的方法總結(jié)

    Java實現(xiàn)漢字轉(zhuǎn)全拼音的方法總結(jié)

    在軟件開發(fā)中,經(jīng)常會遇到需要將漢字轉(zhuǎn)換成拼音的場景,比如在搜索引擎優(yōu)化、數(shù)據(jù)存儲、國際化等方面,Java作為一種廣泛使用的編程語言,提供了多種方法來實現(xiàn)漢字到拼音的轉(zhuǎn)換,本文將詳細介紹幾種常用的Java漢字轉(zhuǎn)全拼音的方法,并提供具體的代碼示例和步驟
    2024-12-12
  • java解析Excel的方法(xls、xlsx兩種格式)

    java解析Excel的方法(xls、xlsx兩種格式)

    這篇文章主要介紹了java解析Excel的方法(xls、xlsx兩種格式),需要的朋友可以參考下
    2018-04-04
  • Java基礎(chǔ)之常用的命令行指令

    Java基礎(chǔ)之常用的命令行指令

    這篇文章主要介紹了Java基礎(chǔ)之常用的命令行指令,文中有非常詳細的圖文示例,對正在學習java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04

最新評論

靖州| 青浦区| 康定县| 苗栗县| 新泰市| 如东县| 全椒县| 天峻县| 五河县| 正阳县| 临猗县| 佛坪县| 江安县| 济阳县| 竹山县| 名山县| 蒲城县| 鱼台县| 恩施市| 论坛| 宁陵县| 清苑县| 宝丰县| 九江县| 阜平县| 治县。| 古浪县| 诸暨市| 甘孜| 海城市| 肥西县| 横山县| 阳曲县| 启东市| 梨树县| 樟树市| 新蔡县| 桂平市| 安多县| 刚察县| 成武县|