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

Java 構造器中 super() 必須在第一行?反編譯代碼可能誤導

     編輯:程式設計綜合問答

標準規則

Java 語言規範(JLS)強制要求:構造器第一條執行語句必須是 `super(...)` 或 `this(...)`**。否則編譯錯誤:Constructor call must be the first statement in a constructor。

現象

MyBatis `SqlSessionTemplate` 構造器原始碼中,`super(...)` 似乎不在第一行(圖片截圖)。

解釋

  1. 反編譯工具產生的代碼順序可能不準確。Javap/IDEA/Bytecode Viewer 顯示的「第一行」可能是隱式初始化、欄位賦值、或編譯器重排後的視圖,非原始 Java 碼結構。
  2. 實際位元碼中,`invokespecial` (super) 指令確實是構造器第一條指令**。編譯器保證此規則,不可能違反。
  3. 常見誤讀**:
    • 靜態初始化塊/實例初始化塊在構造器前執行,但屬於類載入/物件分配階段,非構造器語句。
    • Lombok `@Builder`、`@AllArgsConstructor` 生成的代碼可能看起來順序不同,但位元碼合規。

驗證方法

// 1. 看位元碼
javap -c -v SqlSessionTemplate.class | grep -A 20 "public "

// 2. 寫測試代碼故意違規,確認編譯報錯
class Test {
    Test() {
        System.out.println("before super"); // 編譯錯誤
        super();
    }
}

總結

`super()` **必須是構造器第一條可執行語句**,這是 JVM 強制規則,無例外。看到「不在第一行」的代碼,**99% 是反編譯視圖誤導或讀錯了初始化塊**。信任編譯器與位元碼,不信反編譯器的排版。

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