面向對象(OOP)是 Java 的靈魂。本文系統梳理方法設計、構造器、可變參數、修飾符體系、繼承機制、重載與重寫、多態實現、抽象類、封裝、介面、包管理十大核心模塊,以「語法規則 → 底層原理 → 實戰陷阱 → 最佳實踐」四維度構建進階知識體系。
foo(int) vs foo(long) 調用 foo(1) 匹配 int);可變參數優先級最低。public void printNumbers(int... numbers) { // 本質:int[] numbers
for (int n : numbers) System.out.println(n);
}
// 調用:printNumbers(1, 2, 3); 或 printNumbers(new int[]{1,2,3});
// 限制:每個方法僅一個,必須在參數列表最後
this() 調用本類其他構造器,super() 調用父類構造器(必須首行)。| 修飾符 | 同類 | 同包 | 子類(異包) | 異包非子類 |
|---|---|---|---|---|
| private | ✓ | ✗ | ✗ | ✗ |
| default (無) | ✓ | ✓ | ✗ | ✗ |
| protected | ✓ | ✓ | ✓ | ✗ |
| public | ✓ | ✓ | ✓ | ✓ |
類級別: 只能 public 或 default。public 類文件名必須一致。
| 修飾符 | 類 | 方法 | 變量 | 核心語義 |
|---|---|---|---|---|
| final | 不可繼承 | 不可重寫 | 不可修改(引用) | 鎖定不變量 |
| abstract | 抽象類 | 抽象方法 | — | 強制子類實現/定義契約 |
| static | 內部類 | 類方法 | 類變量 | 屬於類,共享、無 this、優先加載 |
| synchronized | — | 同步方法 | — | 內置鎖,互斥、可見性 |
| native | — | 本地方法 | — | C/C++ 實現,JNI 橋接 |
| transient | — | — | 不序列化 | 跳過序列化 |
| volatile | — | — | 可見性/有序性 | JMM 輕量同步 |
extends 僅一個父類,所有類隱含繼承 Object。implements 多個介面,介面間可多繼承(extends)。super())。super 訪問父類被遮蔽成員;this 當前對象引用。繼承是強耦合(白盒復用),破壞封裝性。優先考慮組合/委派(黑盒復用),僅在「是一種」關係明確、需模板方法/共享非公共邏輯時用繼承。
| 維度 | 重寫 | 重載 |
|---|---|---|
| 位置 | 父子類 | 同一類 |
| 方法名 | 相同 | 相同 |
| 參數列表 | 必須相同 | 必須不同 |
| 返回類型 | 相同或协变(子類型) | 可同可不同 |
| 訪問權限 | ≥ 父類 | 無限制 |
| 拋出異常 | ≤ 父類(非受檢無限制) | 無限制 |
| 綁定時機 | 運行期(動態綁定) | 編譯期(靜態綁定) |
| 多態類型 | 運行時多態 | 編譯時多態 |
| 關鍵字 | @Override 建議 | 無 |
Animal a = new Cat();)a.eat():編譯期看 Animal 有無 eat(),運行期看對象實際類型(Cat)的 eat()。invokevirtual 指令基於對象頭類型指針查找方法表實現。Animal a = new Cat(); // 向上轉型(隱式),只能調用 Animal 定義的方法 a.eat(); // 調用 Cat.eat() Cat c = (Cat) a; // 向下轉型(顯式強轉),需 instanceof 守衛 c.catchMouse(); // 調用 Cat 專有方法
abstract class 不可實例化;可含抽象/非抽象方法、字段、構造器。abstract 返回類型 方法名(); 無方法體。private 字段 + public getter/setter(可加驗證邏輯)。@Data (Lombok) 或 record (Java 14+) 簡化樣板代碼。public abstract 方法,public static final 常量。default、static、private 方法。implements A, B, C,解決單繼承限制。extends,支持鑽石繼承(默認方法衝突需顯式覆蓋)。| 維度 | 抽象類 | 介面 |
|---|---|---|
| 方法實現 | 可有方法體 | Java 8 前無,8+ 有 default |
| 成員變量 | 任意類型 | 僅 public static final |
| 構造器 | 有 | 無 |
| 靜態代碼塊 | 可有 | 無 |
| 繼承/實現 | 單繼承 | 多實現 |
| 設計意圖 | 共享核心邏輯 | 定義行為契約 |
package com.company.module; 必須源文件首行。import pkg.Class; / import pkg.*;,編譯期解析,無運行開銷。src/com/company/module/Class.java)。this()/super()。private,按需放寬;final 廣泛用於不可變場景;@Override 杜絕重寫拼寫錯誤。instanceof。controller/service/repository/domain),控制包級可見性。內化這些原則,配合設計模式(模板方法、策略、工廠等)與 SOLID 原則,方能寫出高內聚、低耦合、易擴展的專業級 Java 代碼。