Java 起源於 C++,但為了解決 C++ 複雜性、記憶體管理、移植性等問題,進行了大膽重設計。本文系統整理 47 項核心差異,涵蓋語法、型別系統、記憶體管理、物件模型、泛型/模板、異常處理、多執行緒、標準庫、原生介面、文檔工具等維度,助 C++ 開發者快速轉型 Java、或 Java 開發者理解底層設計動機。
一、效能與編譯模式(1)
- 速度:早期 Java 解釋執行比 C++ 慢 ~20 倍。現代 JIT(即時編譯)、AOT(GraalVM)、專用硬體大幅縮小差距。熱點程式碼可達 C++ 80-100% 效能。
- 編譯:Java → 位元碼 → JVM 解釋/JIT 編譯;C++ → 直接編譯為機器碼。
二、基本語法差異(2-10)
| # | 項目 | C++ | Java |
| 2 | 註解 | // /* */ | 相同 + /** */ Javadoc |
| 3 | 全域函數/變數 | 支援 | 不支援,必須在類中(static 方法/欄位替代) |
| 4 | 方法定義位置 | 類內宣告、類外實作 | 僅類內完整定義(隱式內聯) |
| 5 | 類定義結尾 | }; | 無分號 |
| 6 | 作用域解析 :: | 用於類名::成員 | 無,統一用 .(類名.靜態成員) |
| 7 | 基本型別大小 | 平台相關 | 固定(int 4B, long 8B 等),跨平台一致 |
| 8 | 字元型別 | char 1B (ASCII) / wchar_t | char 2B Unicode (UTF-16) |
| 9 | 字串常數 | const char* 陣列 | 自動轉為 String 物件 |
| 10 | 右移運算 | >> 算術/邏輯視型別 | >> 算術(帶符號), >>>> 邏輯(補零) |
三、陣列與記憶體模型(11-13)
| # | 項目 | C++ | Java |
| 11 | 陣列 | 棆/堆均可,無邊界檢查 | 僅堆,有 length、邊界檢查拋異常 |
| 12 | 物件建立 | new (堆) / 直接宣告 (棧) | 非基本型別只能 new (堆);基本型別棧上 |
| 13 | 前向宣告 | 需 class Foo; | 不需要,編譯器自動解析 |
四、預處理與模組系統(14-15)
- 14. 預處理器:C++ 有
#include/#define/#ifdef;Java 無,用 import + 套件系統
- 15. 命名空間 vs 套件:C++
namespace;Java package 對應目錄結構,import 類似 using
五、初始化與建構/解構(16-19)
| # | 項目 | C++ | Java |
| 16 | 成員初始化 | 建構子初始化列表 / 體內 | 宣告處 / 實例初始化塊 / 建構子,預設值保證 |
| 17 | 建構子 | 同名、可有初始化列表 | 同名、無初始化列表、預設建構子規則相同 |
| 18 | 解構子 | ~Class() 確定性呼叫 | 無,finalize() 由 GC 不定時呼叫,不可靠 |
| 19 | 資源清理 | RAII (棧物件自動解構) | try-with-resources / AutoCloseable / 顯式 close() |
六、指標與引用(17 續、20-22)
- 17 續:Java 無指標運算。參考傳遞實為引用值傳遞(傳遞引用的副本),無法修改引用本身指向,但可修改物件內容
- 20. 方法多載:兩者均支援
- 21. 預設參數:C++ 支援;Java 不支援(用重載或 Builder 模式替代)
- 22. goto:C++ 有;Java 無,用
break/continue label 跳出多層迴圈
七、繼承體系(23-25)
| # | 項目 | C++ | Java |
| 23 | 繼承樹 | 森林(多根) | 單根:所有類隱式繼承 Object |
| 24 | 模板/泛型 | 模板(編譯期展開,程式碼膨脹) | 泛型(類型擦除,執行期單一程式碼) |
| 25 | 集合 | STL (vector, map...) | Collections Framework (ArrayList, HashMap...) |
八、記憶體管理與 GC(25 續、26)
- 25 續:Java 無
Vector/Stack/Hashtable 等舊集合的同步開銷,新集合非同步
- 26. 垃圾收集:自動 GC 消除多數記憶體洩漏。C++ 需手動
delete/智慧指標。GC 非即時,finalize() 不可靠,資源仍需顯式釋放
九、多執行緒(26 續、27)
- 26 續:Java 內建
Thread、synchronized、volatile、java.util.concurrent 高階組件
- 27:
synchronized 方法/區塊 → 物件級監視器鎖。遞歸安全。C++11 起有 std::mutex、std::thread
十、存取控制(27 續、28)
- 27 續:Java
public/protected/private + 預設 package-private
- 28:C++
friend 破壞封裝;Java 無。內部類持有外部類引用,可無條件存取外部私有成員,優雅解決回調問題
十一、巢狀/內部類與指向成員指標(28 續、29)
- 28 續:Java 1.1+ 內部類秘密持有
Outer.this,可直接存取外部私有成員
- 29:因此 Java 無「指向成員指標」,內部類替代該用例
十二、內聯、繼承語法、介面(30-35)
| # | 項目 | C++ | Java |
| 30 | 內聯 | inline 建議 | final 方法建議 JVM 內聯,程式設計師不可控 |
| 31 | 繼承關鍵字 | : + public/protected/private | extends (單繼承) + super 呼叫父建構子/方法 |
| 32 | 繼承存取層級 | 可改變 | 不可改變,子類方法不可減弱父類存取權 |
| 33 | 介面 | 純虛擬類模擬 | interface 關鍵字,implements 多實作 |
| 34 | 虛擬函數 | virtual 選擇性動態綁定 | 所有非 static 方法預設動態綁定,final 禁止覆寫 |
| 35 | 多重繼承 | 支援(菱形問題需虛擬繼承) | 不支援類多重繼承,但可 implements 多介面 |
十三、執行期型別識別與轉型(36)
- C++:
typeid, dynamic_cast, static_cast, reinterpret_cast, const_cast
- Java:
obj.getClass().getName(), (SubType)obj(自動動態檢查拋 ClassCastException)
十四、異常處理(37-38)
| # | 項目 | C++ | Java |
| 37 | 機制 | try/catch/throw,無 finally | try/catch/finally,throws 聲明檢查性異常 |
| 38 | 異常規範 | 執行期 unexpected() | 編譯期強制檢查,覆寫方法異常需相容 |
十五、運算符多載與常數(39-40)
- 39:C++ 支援運算符多載;Java 僅
String 特殊支援 +/+=
- 40:C++
const 複雜;Java final(變數/方法/類)+ static final 編譯期常數
十六、應用程式 vs Applet、原生方法(41-42)
- 41:Applet 歷史遺物(沙箱、簽名),現代 Java 以 Web Start/JNLP/模組化替代
- 42:JNI (Java Native Interface) 呼叫 C/C++,僅 Application 可用,Applet 禁止。隔離平台相關代碼
十七、文檔、標準庫、JavaBeans、健壯性(43-47)
| # | 項目 | C++ | Java |
| 43 | 文檔工具 | Doxygen 等第三方 | 內建 Javadoc,源碼含文檔,生成 HTML |
| 44 | 標準庫 | STL + 第三方 (Boost, Qt...) | 統一標準庫:網路、JDBC、多執行緒、RMI/CORBA、壓縮、加密 |
| 45 | 元件模型 | 廠商專屬 (ActiveX, COM...) | JavaBeans 統一規範,跨 IDE 可視化開發 |
| 46 | 空引用檢查 | 未定義行為/段錯誤 | 自動拋 NullPointerException |
| 47 | 健壯性保障 | 依賴程式設計師紀律 | null 初始化、邊界檢查、GC、異常機制、位元碼驗證、多執行緒語言級支援 |
總結
Java 通過移除指標、多重繼承、運算符多載、預處理器、解構子等複雜特性,引入單根繼承、介面、泛型擦除、自動 GC、內建多執行緒、標準庫、Javadoc,大幅降低認知負荷、消除一大類 Bug、提升跨平台一致性。現代 Java (JIT、AOT、GraalVM、Project Valhalla、Panama) 持續縮小效能差距,並在模組化、原生互操作、值型別等領域創新。理解這 47 項差異,能讓你在技術選型、跨語言遷移、底層除錯時做出最佳決策。
- 上一篇文章: Java 手寫鏈表完整實作:節點設計、增刪改查、反轉與遞歸操作教學版
- 下一篇文章: 【Java 每日一題】20170301:類初始化順序與靜態/實例變數賦值陷阱
Copyright ©
程式碼之家 All Rights Reserved