在 Java 學習的進階階段,面向對象程式設計(OOP)的三大核心特性——封裝、繼承、多態,構成了建構健壯、可維護軟體架構的基石。本文將系統梳理這三大特性的核心概念、代碼實踐,並深入講解 super 關鍵字與方法重寫的關鍵細節,助你夯實 Java 基礎。
封裝的核心思想是將數據(屬性)與操作數據的方法綁定在一起,並對外隱藏內部實現細節。通過權限修飾符控制訪問權限,實現數據的保護與模組化。
public:公共訪問,無限制private:私有訪問,僅本類可見(注意:原文誤寫為「公有的」,此處已修正)protected:受保護訪問,同包及子類可見private 修飾需封裝的成員變量set/get 方法訪問屬性
set屬性名()(屬性首字母大寫)get屬性名()(屬性首字母大寫)// 姓名設置器
public void setName(String name) {
this.name = name;
}
// 姓名訪問器
public String getName() {
return name;
}
class Student {
private String name;
private String sex;
private int age;
// 構造方法
public Student(String name, String sex) {
this.name = name;
if (sex.equals("男") || sex.equals("女")) {
this.sex = sex;
}
}
// 業務方法
public void study() {
System.out.println(name + "在學習");
}
// 性別設置器(含業務邏輯驗證)
public void setSex(String sex) {
if (sex.equals("男") || sex.equals("女")) {
this.sex = sex;
} else {
System.out.println("輸入不合法,請重新輸入");
}
}
public String getSex() { return sex; }
public void setName(String name) { this.name = name; }
public String getName() { return name; }
public void setAge(int age) { this.age = age; } // 僅提供設置器
}
public class FengZhuangDemo {
public static void main(String[] args) {
Student star = new Student("星星", "性別"); // 非法性別
star.study();
System.out.println(star.getSex()); // 輸出 null
}
}
思考:並非所有屬性都需要 set/get 方法,視業務需求而定(如唯讀屬性僅提供 getter)。
繼承讓子類獲得父類的屬性與方法,實現代碼復用與擴展性。Java 單繼承(單根繼承),但支持多層繼承。
class Person {
String name;
String sex;
Dog dog; // 關聯關係:整體→部分
public void eat() {
System.out.println(name + "在吃飯");
}
}
// 繼承關係:extends 關鍵字
class Student extends Person {
int age;
public void study() {
System.out.println(name + "在學習"); // 直接訪問父類非私有屬性
}
}
super())super 代表父類對象引用,核心用途:
super.屬性名super(參數),必須放在構造方法第一行class Student extends Person {
public Student(String name, String sex) {
super(name, sex); // 顯式調用父類有參構造
// this() 與 super() 不能同時出現
}
}
關聯(Association)表現為「has-a」關係,如 Person 持有 Dog 對象,而非繼承。代碼示例:
class Person { Dog dog; }
class Dog { String name; void cry() {...} }
Person star = new Person();
star.dog = new Dog();
star.dog.cry(); // 星星的狗在叫
當父類方法無法滿足子類業務需求時,子類通過重寫(Override)重新實現方法。
private < protected < public)多態定義:父類引用指向子類對象(Animal a = new Dog())。
| 成員類型 | 訪問結果 |
|---|---|
| 同名成員變量(靜態/非靜態) | 訪問父類變量 |
| 同名非靜態方法 | 訪問子類方法(動態綁定) |
| 同名靜態方法 | 訪問父類方法(靜態綁定) |
| 子類特有屬性/方法 | 不可訪問(需向下轉型) |
abstract class MyShape {
public abstract void getArea();
public abstract void getLength();
}
class Circle extends MyShape {
int r; final double PI = 3.14;
public void getArea() { System.out.println("圓的面積"); }
public void getLength() { System.out.println("圓的周長"); }
}
class Rect extends MyShape {
public void getArea() { System.out.println("矩形的面積"); }
public void getLength() { System.out.println("矩形的周長"); }
}
public class PolyDemo {
// 多態作為參數:接受任意圖形
public static void getAreaAndLength(MyShape ms) {
ms.getArea();
ms.getLength();
}
// 多態作為返回類型
public static MyShape getMyShape(int i) {
return (i == 0) ? new Circle() : new Rect();
}
public static void main(String[] args) {
getAreaAndLength(new Circle()); // 圓的面積/周長
getAreaAndLength(new Rect()); // 矩形的面積/周長
MyShape shape = getMyShape(0);
// 向下轉型訪問子類特有功能
Circle c = (Circle) shape;
}
}
super 橋接父子類初始化這三大特性相輔相成,構成了 Java 面向對象設計的鐵三角。深入理解其底層機制與最佳實踐,能讓你編寫出更優雅、健壯、可維護的代碼。