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

Java 面向對象基石:對象模型、構造器機制與內存佈局圖解

     編輯:Java 綜合教學

對象:問題領域的抽象,封裝狀態與行為

對象三大特性:封裝(綁定屬性與方法、隱藏內部細節)、繼承(單繼承、多實現、不可繼承 private 成員)、多態(父類引用指向子類對象、動態綁定)。

構造器核心規則

  1. 方法名與類名相同,無返回值類型(連 void 也不能寫)。
  2. 作用:在堆內存中為對象屬性分配空間並完成初始化。
  3. 至少一個:無顯式定義時編譯器生成無參構造器;一旦定義任何構造器,默認無參構造器消失。
  4. 可重載:通過參數列表區分,編譯器根據實參類型綁定調用目標。
  5. 權限可為 `private`(單例模式、構建者模式常用)。
  6. 由 JVM 在 `new` 指令執行時調用,非開發者直接調用。

對象創建與內存佈局

// 假設類定義
class Person {
    String name;   // 引用類型,4/8 字節(指向堆中 String 對象)
    int age;       // 基本類型,4 字節,直接存儲在對象內存佈局中
    // 方法不佔用對象實例內存,存放在方法區
}

創建對象時 JVM 做了什麼?

  1. 類加載檢查(常量池符號引用解析)。
  2. 在堆中分配實例內存(包含所有非 static 欄位,引用類型佔 4/8 字節,基本類型按大小)。
  3. 將分配內存初始化為零值(null/0/false)。
  4. 設置對象頭(HashCode、GC 分代年齡、鎖狀態、類元數據指針)。
  5. 執行 `` 方法(構造器字節碼):執行字段顯式賦值、代碼塊、父類構造器、本類構造器代碼。

子類構造器隱式調用父類構造器

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`。基本類型按規格固定大小。

對象內存佈局圖

核心口訣

「構造器初始化堆中屬性,引用四字節指向對象,方法區存代碼不佔實例,子類構造必先調父構造,私有構造單例門道。」
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved