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

Java 核心基礎:深入理解對象引用與內存模型

     編輯:Java 綜合教學

前言:揭開對象在內存中的真面目

在之前的學習中,我們習慣了「創建對象、調用方法」這套流程,卻鮮少探討對象在 JVM 內存中究竟如何存儲、如何被訪問。這一講將打破這層迷霧,引入 對象引用 這一核心概念,帶你透徹理解 Java 內存模型的運作機制。

什麼是對象引用?

沿用經典的 Human 類為例,當我們在 Test 類中編寫:

Human aPerson = new Human(160);

這行看似簡單的代碼,實則包含三個關鍵動作:

  1. new 關鍵字:在 堆內存 上為對象分配空間,存放對象的屬性數據與方法信息。
  2. 引用變量 aPerson:它並非對象本身,而是一個「遙控器」—— 指向堆中對象的地址,存儲在 棧內存 中。
  3. 賦值操作:將堆中對象的地址賦給棧上的引用變量,建立「引用 → 對象」的連接。
堆棧內存示意圖
圖示:引用存放在棧,對象實體存放在堆

棧與堆的分工協作

  • 棧:讀取速度極快,但生命週期隨方法調用而始終。方法結束,棧幀銷毀,基本類型變量與引用變量隨之消失。
  • 堆:所有普通對象(new 出來的)均駐留於此,不受單一方法生命週期限制,由垃圾回收器統一管理。
  • 基本類型:int、double 等直接在棧上存儲數值本身,無需 new,變量名即代表數值。
風箏與人類比引用與對象
生動比喻:引用像風箏線,對象像風箏本體

引用賦值:多個「遙控器」操控同一對象

當執行 Human dummyPerson = aPerson; 時,複製的是對象地址,而非對象本身。兩個引用指向同一堆對象,任一引用修改對象狀態,另一引用即可見到變化。

public class Test {
    public static void main(String[] args) {
        Human aPerson = new Human(160);
        Human dummyPerson = aPerson;      // 共享同一對象
        System.out.println(dummyPerson.getHeight()); // 160
        aPerson.growHeight(20);           // 通過 aPerson 修改
        System.out.println(dummyPerson.getHeight()); // 180,dummyPerson 同步看到變化
    }
}

垃圾回收:自動內存管理的守護者

方法結束時,棧上的引用銷毀,但堆上對象仍存活。若無任何引用指向某對象(如圖中 Club Object),GC 判定其為「垃圾」並回收內存。核心原則:

可達性分析:從 GC Roots 出發,無引用鏈可達的對象即為可回收對象。
GC 可達性分析示意
圖示:Human Object 有引用存活,Club Object 無引用被回收

參數傳遞:始終是「值傳遞」

  • 基本類型:傳遞數值副本,方法內修改不影響原變量。
  • 引用類型:傳遞地址副本,方法內通過地址訪問對象,修改對象內容對外可見;但若在方法內 new 新對象並重新賦值給參數,則不影響外部原引用指向的對象。

總結速查

核心概念關鍵點
new在堆上創建對象,返回地址
引用 vs 對象引用在棧,對象在堆;引用指向對象
引用賦值複製地址,多引用共享一對象
垃圾回收條件無任何引用指向(不可達)
參數傳遞值傳遞(基本類型傳值,引用類型傳地址)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved