首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

【Java每日一題】建構子區塊與多載建構子的實例計數陷阱

     編輯:Java 綜合教學

【Java每日一題】建構子區塊與多載建構子的實例計數陷阱

今天我們來探討一個經典的 Java 基礎題目,主題圍繞著建構子區塊(Instance Initialization Block)與多載建構子之間的互動,以及它們如何影響靜態計數器的統計結果。

題目程式碼分析

package Dec2016;
public class Ques1207 {
    public static void main(String[] args) {
        new Test();
        new Test(1);
        new Test("1");
        System.out.println("實例數量為:" + Test.getNumOfInstances());
    }
}

class Test {
    private static int numOfInstances = 0; // 記錄實例數量

    { 
        numOfInstances++; // 建構子區塊:每建立一個實例就執行一次
    }

    public Test() { }
    
    public Test(int num) { }
    
    public Test(String str) {
        this(); // 顯式呼叫無參數建構子
    }

    public static int getNumOfInstances() {
        return numOfInstances;
    }
}

核心考點解析

  1. 建構子區塊的執行時機:區塊 `{ numOfInstances++; }` 屬於實例初始化區塊,它在每個建構子執行之前自動被呼叫,無論建構子是否有參數。
  2. `this()` 的連鎖效應:第三個建構子 `Test(String str)` 透過 `this()` 呼叫了無參數建構子 `Test()`。雖然發生了建構子鏈呼叫,但實例初始化區塊在整個鏈條中只會執行一次(緊接在 `super()` 之後、建構子本體之前)。
  3. 實例化次數統計:`main` 方法中共 `new` 了三次,因此建構子區塊執行三次,`numOfInstances` 遞增至 3。

程式執行結果

主程式能夠正常編譯並執行,輸出結果為:

實例數量為:3

常見誤區提醒

  • 誤以為 `this()` 會導致建構子區塊重複執行(實際上不會)。
  • 混淆「靜態初始化區塊」(`static {}`)與「實例初始化區塊」(`{}`),前者僅在類載入時執行一次,後者每建立一個實例執行一次。

這道題目精準考察了 Java 物件初始化的順序細節,是建構子機制理解是否扎實的試金石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved