對象:問題領域的抽象,封裝狀態與行為
對象三大特性:封裝(綁定屬性與方法、隱藏內部細節)、繼承(單繼承、多實現、不可繼承 private 成員)、多態(父類引用指向子類對象、動態綁定)。
構造器核心規則
- 方法名與類名相同,無返回值類型(連 void 也不能寫)。
- 作用:在堆內存中為對象屬性分配空間並完成初始化。
- 至少一個:無顯式定義時編譯器生成無參構造器;一旦定義任何構造器,默認無參構造器消失。
- 可重載:通過參數列表區分,編譯器根據實參類型綁定調用目標。
- 權限可為 `private`(單例模式、構建者模式常用)。
- 由 JVM 在 `new` 指令執行時調用,非開發者直接調用。
對象創建與內存佈局
// 假設類定義
class Person {
String name; // 引用類型,4/8 字節(指向堆中 String 對象)
int age; // 基本類型,4 字節,直接存儲在對象內存佈局中
// 方法不佔用對象實例內存,存放在方法區
}
創建對象時 JVM 做了什麼?
- 類加載檢查(常量池符號引用解析)。
- 在堆中分配實例內存(包含所有非 static 欄位,引用類型佔 4/8 字節,基本類型按大小)。
- 將分配內存初始化為零值(null/0/false)。
- 設置對象頭(HashCode、GC 分代年齡、鎖狀態、類元數據指針)。
- 執行 `` 方法(構造器字節碼):執行字段顯式賦值、代碼塊、父類構造器、本類構造器代碼。
子類構造器隱式調用父類構造器
class Father { Father() { System.out.println("Father init"); } }
class Son extends Father { Son() { /* 隱式 super() */ System.out.println("Son init"); } }
new Son(); // 輸出: Father init -> Son init
// 注意:只調用父類構造器,不創建父類獨立對象!
實體類 vs 測試類
- 實體類:封裝屬性、提供 getter/setter、業務方法,無 `main`。
- 測試類:包含 `main`,創建實體對象、調用方法驗證邏輯。
- 訪問權限控制:`private` 只能本類訪問,需通過 public 方法間接操作。
包機制與編譯運行
- 包聲明對應目錄結構:`package com.demo;` -> 源文件在 `com/demo/`。
- 編譯輸出目錄:`javac -d . Demo.java` 生成 `com/demo/Demo.class`。
- 導入包:`import com.demo.*;` 或全限定名。
引用類型默認值與內存圖
引用類型欄位在堆中佔 4 字節(32位 JVM)或 8 字節(64位開啟壓縮指針),默認值 `null`。基本類型按規格固定大小。

核心口訣
「構造器初始化堆中屬性,引用四字節指向對象,方法區存代碼不佔實例,子類構造必先調父構造,私有構造單例門道。」