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

我的物件導觀點:釐清「面向物件」與「基於物件」的本質差異、C++ 的雙重人格、Java 的徹底性與 OCP 原則實踐

     編輯:Java 程式設計入門

誤區一:「面向物件」≠「基於物件」

特性面向物件 (OO)基於物件 (OB)
封裝✅✅
繼承✅❌
多型✅❌
能否定義新類型✅❌(僅能使用現成類別)
典型代表Java、C++、C#、Smalltalk、PythonJavaScript (ES5)、VB6、VBScript、Flash ActionScript 1/2

判斷新技術是否 OO:看能否繼承現有類別產生新類型、能否以父類別型別持有子類別實例(多型)。

誤區二:C++ 是純粹的 OO 語言?

老師金句:「C++ 打著面向物件的旗幟,幹著過程式編程的勾當。」 三層含義:

  1. 相容 C 的代價: C++ 編譯器可編譯純 C 程式 → 大量存量程式碼繼續用 C 風格寫,貼上 C++ 標籤。
  2. 使用者 ≠ 設計者: 大多數 C++ 程式員只用 MFC/OWL/VCL 類別庫,以為「繼承幾個類別」就是 OO,實則只是把類別庫當高級函式庫用,思維未轉型。
  3. 雙路徑阻礙推廣: 只要還有「舊路」(過程式)可走,團隊就不會強迫自己走「新路」(OO 思維)。

Java 比 C++ 更徹底貫徹 OO

  • 無全域函式/變數 → 一切皆歸屬類別。
  • 無指標運算 → 記憶體安全由語言保證。
  • 單一繼承 + 介面多實作 → 強制契約導向設計。
  • 標記介面 Cloneable、Serializable 等語言層面協議。
  • 反射、Annotation 等中介機制支援框架級 OO 抽象。

OCP (Open-Closed Principle) 與抽象類別

對擴充開放、對修改關閉。 抽象類別(abstract class/interface)是關鍵:模組依賴固定抽象,透過繼承/實作擴充行為,無需修改既有程式碼。

抽象類別的兩種 Java 實現:abstract class vs interface

維度abstract classinterface
關係語意is-a(繼承)can-do / has-capability(契約)
多重實作單一繼承可多實作
預設方法可有非 abstract 方法、建構子、欄位Java 8+ default/static 方法,無實例欄位
演進成本新增非 abstract 方法不破壞子類Java 8 前新增方法破壞所有實作;default 緩解
選擇建議共享程式碼、狀態、強 is-a 關係定義能力契約、多重實作、跨層級複用

給架構師的三個提問

  1. 這個抽象代表「是什麼」 還是 「能做什麼」?
  2. 子類別/實作類是否需要共享狀態與邏輯?
  3. 未來是否需要多重組合能力?

答對這三問,abstract class 與 interface 的選擇就不再隨意。

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