首頁 Java java教程 Java類別的靜態成員、靜態程式碼區塊、普通成員、普通程式碼區塊、建構方法初始化執行的順序詳細說明

Java類別的靜態成員、靜態程式碼區塊、普通成員、普通程式碼區塊、建構方法初始化執行的順序詳細說明

Mar 19, 2017 am 11:20 AM
java類

  今天閱讀《Java程式思想(第4版中文版)》,剛複習到類別中成員的初始化這一知識點。為了加深印象和給其他人一點參考,參考書中範例並加以修改得到以下程式碼:

檔名:HelloWorld.java

套件名稱:main

package main;
class Bowl {
    Bowl(int marker){
        System.out.println("Bowl("+marker+")");
    }
    void f1(int marker){
        System.out.println("f1("+marker+")");
    }
}
class Table{
    static Bowl bowl1 = new Bowl(1); 
    public Table() {
        System.out.println("Table()");
        bowl2.f1(1);
    }
    void f2 (int marker){
        System.out.println("f2("+marker+")");
    }
    static Bowl bowl2 = new Bowl(2); 
}
class Cupboard{
    {
        System.out.println("Cupboard类普通代码块执行");
    }
    Bowl bowl3 = new Bowl(3); // 注意,此处不是静态成员
    static Bowl bowl4 = new Bowl(4);
    static{
        System.out.println("Cupboard类静态代码块执行");
    }
    public Cupboard() {
        // TODO Auto-generated constructor stub
        System.out.println("Cupboard()");
        bowl4.f1(2);
    }
    void f3(int marker){
        System.out.println("f3("+marker+")");
    }
    static Bowl bowl5 = new Bowl(5);
}
public class HelloWorld  {
   public static void main(String args[]){
       System.out.println("Creating new Cupboard() in main");
       new Cupboard();
       table.f2(1);
       cupboard.f3(1);
   }
   static Table table = new Table();
   static Cupboard cupboard = new Cupboard();
}
登入後複製

下面讓我們來分析一下該程式的運行。

1. 首先java虛擬機器要執行main方法,必須先載入類別HelloWorld

2. 發現類別HelloWorld中含有靜態資料(只有靜態成員),開始初始化靜態成員
首先 
【1】 static Table table = new Table(); 所以需要載入Table類別。發現該類別含有靜態成員,根據定義的先後順序執行初始化操作
【2】static Bowl bowl1 = new Bowl(1); 輸出:Bowl(1)
【3】 static Bowl bowl2 = new Bowl( 2); 輸出:Bowl(2)
【4】建構子Table(),輸出:Table()和f1(1)

其次 
【1】 static Cupboard cupboard = new Cupboard(); 所以需要載入Cupboard類別。發現該類別含有靜態資料(包括靜態成員和靜態程式碼區塊),根據二者定義的先後順序執行初始化操作
【2】 static Bowl bowl4 = new Bowl(4); 輸出:Bowl(4)
【3】 
  static{
    System.out.println("Cupboard類別靜態程式碼區塊執行");
  }
  ic輸出:Cupboard類別執行程式碼區塊執行程式碼區塊執行Bowl bowl5 = new Bowl(5); 輸出:Bowl(5)
靜態成員初始化後,透過new產生
物件。發現類別中含有成員定義時賦值與普通程式碼區塊,根據二者定義的先後順序執行初始化操作【1】
   {
    System.out.println("Cupboard類別普通程式碼區塊執行" );
   }
   輸出:Cupboard類別普通程式碼區塊執行
【2】 Bowl bowl3 = new Bowl(3); 輸出:Bowl(3)
【3】 建構子Cupboard(),建構子 程式碼輸出:Cupboard()和f1(2)

3. 進入main方法

【1】 System.out.println("Creating new Cupboard() in main"); 輸出:Creating new Cupboard( ) in main
【2】 new Cupboard(); 發現Cupboard類別中含有成員定義時賦值和普通程式碼區塊,根據二者定義的先後順序執行初始化操作,輸出:Cupboard類別普通程式碼區塊執行和Bowl( 3)
【3】建構子Cupboard(),輸出:Cupboard()和f1(2)
【4】 table.f2(1); 輸出:f2(1)
【5】 cupboard .f3(1); 輸出:f3(1)
綜上所述,程式的輸出結果為:
Bowl(1)
Bowl(2)
Table()
f1 (1)
Bowl(4)
Cupboard類別靜態程式碼區塊執行
Bowl(5)
Cupboard類別普通程式碼區塊執行
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Cupboard類別普通程式碼區塊執行
Bowl(3)
Cupboard()
f1(2)
f2(1 )
f3(1)

java類別資料的初始化總結如下:

1. 靜態成員和靜態程式碼區塊依照定義的先後順序執行初始化

  這裡要注意一點就是:靜態程式碼執行的前提是java虛擬機器要先載入這個類,而且靜態資料只會初始化一次。當首次產生一個類別的物件或首次存取屬於該類別的靜態資料成員時,該類別就會被載入了。

2. 普通成員定義處賦值與普通程式碼區塊依定義的先後順序執行初始化

#3. 最後才是

建構方法初始化#

以上是Java類別的靜態成員、靜態程式碼區塊、普通成員、普通程式碼區塊、建構方法初始化執行的順序詳細說明的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本啟動Spring...

使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? 使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? Apr 19, 2025 pm 09:51 PM

在使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名以構建查詢條件,是一個常見的難題。本文將針...

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

See all articles