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

Java 基本型別與引用型別核心差異:記憶體模型、參數傳遞與實戰驗證

     編輯:Java 程式設計入門

理解基本型別與引用型別在記憶體中的存儲差異、參數傳遞機制,是寫出無 Bug Java 代碼的基石。本文結合 JVM 記憶體模型圖解、實戰代碼驗證,徹底講透這一核心知識點。

記憶體模型圖解

基本型別存儲在棧幀局部變量表 引用型別:棧存引用,堆存對象 方法參數傳遞:基本型別傳值,引用型別傳引用值

核心差異對比表

維度基本型別引用型別
包含類型byte, short, int, long, float, double, char, boolean類、介面、陣列、枚舉、Annotation
存儲位置棧幀局部變量表(直接存值)棧存引用(地址),堆存對象實體
預設值0, 0.0, false, '\u0000'null
賦值語義值拷貝(深拷貝)引用拷貝(淺拷貝,指向同一對象)
== 比較比較數值比較引用地址
生命週期隨作用域結束銷毀由 GC 管理,無引用時回收

實戰代碼驗證

package com.liu.u6.copy1;

public class DataTypeDemo {
    public static void main(String[] args) {
        System.out.println("=== 基本型別 ===");
        int num1 = 3;
        int num2 = 5;
        System.out.println("num1 原值:" + num1); // 3
        num2 = num1;        // 值拷貝
        num2 = 8;           // 修改 num2
        System.out.println("num2 改後 num1:" + num1); // 3 未變

        System.out.println("\n=== 引用型別 ===");
        Person p1 = new Person();
        p1.age = 23;
        Person p2 = p1;     // 引用拷貝,指向同一對象
        System.out.println("修改前 p1.age:" + p1.age); // 23
        p2.age = 29;        // 通過 p2 修改對象屬性
        System.out.println("修改後 p1.age:" + p1.age); // 29 同步變化!
    }
}

class Person {
    public int age;
}

執行結果

=== 基本型別 ===
num1 原值:3
num2 改後 num1:3

=== 引用型別 ===
修改前 p1.age:23
修改後 p1.age:29

方法參數傳遞鐵律

Java 唯一支援「值傳遞」

  • 基本型別:傳遞數值拷貝,方法內修改不影響外部
  • 引用型別:傳遞引用地址拷貝,方法內可修改對象內容,但無法讓外部引用指向新對象
void modify(Person p) {
    p.age = 30;        // ✅ 修改對象內容,外部可見
    p = new Person();  // ❌ 只改變區域引用指向,外部無感
}

避坑指南

  1. 集合/陣列傳遞:傳入方法後對元素增刪改,外部集合同步變化
  2. 不可變對象:String、Integer 等操作會產生新對象,原引用不變
  3. 深拷貝需求:手動 new 新對象拷貝屬性,或用序列化/建構子複製
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved