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

Java 物件導向核心:從類、物件到建構子的完整思維模型

     編輯:Java 綜合教學

Java 物件導向核心:從類、物件到建構子的完整思維模型

這是「計算機程式的思維邏輯」系列第 13 篇。前幾節我們探討了函式呼叫機制,接下來幾節將深入「類」的世界。本文將從自訂資料類型的角度,系統剖析 Java 類的四大構成要素、存取控制、建構子機制、記憶體生命週期,幫你建立完整的 OOP 思維框架。

為什麼需要「類」這個概念?

程式本質是「資料 + 對資料的操作」。Java 提供 8 種基本型別,但真實世界的概念(如「訂單」、「使用者」、「幾何圖形」)遠超基本型別能表達的範圍。類就是讓我們自訂資料類型的機制,將屬性與操作封裝在一起,形成可複用、可擴充的模組。

類的兩種視角

  • 函式容器視角:如 Math、Arrays,僅靜態方法集合,不需實例化。
  • 自訂資料類型視角:每個類定義一種新類型,包含四大要素:
分類關鍵字術語說明
類型本身屬性static field類變數/靜態變數如 Math.PI,屬於類,不屬於某個實例
類型本身操作static method類方法/靜態方法如 Math.abs(),透過類名直接呼叫
實例擁有屬性instance field實例變數/成員變數如 Point.x,每個物件獨擁一份
實例可執行操作instance method實例方法如 Point.distance(),可直接存取實例變數

關鍵字深度解析

存取修飾符

  • public:公開,任何地方可存取。
  • private:私有,僅類內部可存取。封裝的核心:隱藏實作細節,防止誤用。
  • default (package-private):同套件可見。
  • protected:同套件 + 子類別可見。

static:靜態 vs 實例

  • 修飾變數 → 類變數,全類共享一份,類載入時初始化。
  • 修飾方法 → 類方法,無 this,只能操作參數與靜態變數。
  • 實例方法隱含 this 參數,可直接存取實例變數。

final:不可變承諾

  • 修飾變數 → 常數,賦值後不可變,編譯器可優化(如內聯 Math.PI)。
  • 修飾方法 → 禁止覆寫。
  • 修飾類 → 禁止繼承。

this:當前實例參考

  • 消除同名參數歧義:this.x = x;
  • 建構子鏈呼叫:this(0, 0); 必須放第一行。
  • 傳遞當前物件:return this; 支援鏈式呼叫。

實戰:定義與使用 Point 類

版本 1:Public 欄位(不推薦)

class Point {
    public int x;
    public int y;
    public double distance() {
        return Math.sqrt(x*x + y*y);
    }
}

使用:

Point p = new Point();
p.x = 2; p.y = 3;
System.out.println(p.distance()); // 3.605...

缺點:直接暴露欄位,無法驗證、攔截、記錄,違反封裝原則。

版本 2:Private 欄位 + Getter/Setter(標準 JavaBean 風格)

class Point {
    private int x;
    private int y;

    public void setX(int x) { this.x = x; }
    public void setY(int y) { this.y = y; }
    public int getX() { return x; }
    public int getY() { return y; }

    public double distance() { return Math.sqrt(x*x + y*y); }
}

優點:可在 setter 加入驗證邏輯(如座標範圍檢查),未來易於維護擴充。

版本 3:引入建構子簡化初始化

class Point {
    private int x;
    private int y;

    public Point() { this(0, 0); } // 無參建構子,委派給下方
    public Point(int x, int y) { this.x = x; this.y = y; } // 全參建構子

    // getter/setter/distance 同前
}

使用:

Point p = new Point(2, 3); // 一行完成建立與賦值

建構子特性:

  • 名稱必須與類名相同
  • 無回傳型別(連 void 都不能寫)
  • 可多載
  • 若未自訂任何建構子,編譯器自動產生無參預設建構子;否則不會
  • 可 private → 單例模式、工廠模式、工具類防實例化

記憶體與生命週期:堆 vs 棧

  • 類載入:首次 new 或存取靜態成員時,類載入至方法區,靜態變數初始化,生命週期至 JVM 結束。
  • 物件建立:new Point() 在堆配置記憶體,實例變數賦預設值,執行建構子,回傳參考存於棧區區域變數。
  • 物件銷毀:無活躍參考指向時,由 GC 自動回收堆記憶體;棟區參考隨方法結束自動釋放。
  • 實例方法本質:可視為靜態方法 + 隱含 this 參數,p.distance() 相當於 Point.distance(p)。

關鍵字總表

關鍵字可修飾對象核心語意
public類、方法、變數、建構子公開存取
private類、方法、變數、建構子私有,僅類內可見
static變數、方法、內部類屬於類,非實例
final變數、方法、類不可變/不可覆寫/不可繼承
this(非修飾符)當前實例參考

下一步預告

本節的 Point 類屬性皆為基本型別。下一節將探討類的組合——當屬性本身也是物件時,如何表達更複雜的領域模型(如「訂單包含多個訂單項」、「學生屬於某個班級」)。敬請關注微信公眾號「老馬說程式」獲取最新內容。

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