中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java初始化塊及執行過程解析

發布時間:2020-10-04 03:22:17 來源:腳本之家 閱讀:122 作者:冰湖一角 欄目:編程語言

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

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

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

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

[修飾符]{

  //初始化塊的可執行代碼

  ...

}

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

下面通過一段程序代碼看看創建對象Dog時發生了什么。

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

運行結果為:

第一個初始化塊
第二個初始化塊
Dog的無參構造器

從運行結果可以看出:當創建一個Dog對象時,程序先執行初始化塊后執行構造器,而且兩個初始化的執行順序是按照前后順序執行的。

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

既然初始化塊和構造器都是創建對象的時候執行,那么它們有什么區別呢?

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

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

普通初始化塊負責對對象進行初始化,而靜態初始化塊負責對類進行初始化,所以靜態初始化塊總是比普通初始化塊先執行。

靜態初始化塊通常用于對類變量執行初始化處理,不能對實例變量進行初始化處理。

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

初始化塊執行的時候會一直上溯到java.lang.Object類,先執行Object的初始化塊,再執行其父類的初始化塊...最后才執行該類自己的初始化塊。

下面看下這段代碼的執行順序結果:

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

執行結果如下:

Biology的靜態初始化塊
Animal的靜態初始化塊
Cat的靜態初始化塊
Biology的普通初始化塊
Biology的無參構造器
Animal的普通初始化塊
Animal的無參構造器
Animal的帶參構造器,name=Java典籍
Cat的普通初始化塊
Cat的無參構造器
=========
Biology的普通初始化塊
Biology的無參構造器
Animal的普通初始化塊
Animal的無參構造器
Animal的帶參構造器,name=Java典籍
Cat的普通初始化塊
Cat的無參構造器

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

一旦Cat類初始化成功后,其在虛擬機中一直存在,當第二次再創建Cat對象時 無需再對Cat類進行初始化。

綜上,一個類初始化的執行順序為:父類靜態初始化塊,該類靜態初始化塊,父類普通初始化塊,父類構造器,該類普通初始化塊,該類構造器。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

河曲县| 淮滨县| 长海县| 郧西县| 隆子县| 扶绥县| 内黄县| 静安区| 吐鲁番市| 武山县| 曲靖市| 抚宁县| 犍为县| 罗江县| 乌鲁木齐市| 阿巴嘎旗| 乐昌市| 铜川市| 裕民县| 武乡县| 徐州市| 凤阳县| 平阳县| 仙居县| 绍兴市| 互助| 岳普湖县| 保亭| 林周县| 衡东县| 宽甸| 临湘市| 司法| 岑溪市| 浦江县| 丁青县| 威海市| 盱眙县| 仁怀市| 湖州市| 临沂市|