🤟致敬讀者
- 🟩感謝閱讀🟦笑口常開🟪生日快樂?早點睡覺
📘博主相關
- 🟧博主信息🟨博客首頁🟫專欄推薦🟥活動信息
文章目錄
- JavaSE核心知識點02面向對象編程02-02(封裝、繼承、多態)
- **一、封裝(Encapsulation)**
- **1. 什么是封裝?**
- **2. 如何實現封裝?**
- **3. 代碼示例**
- **4. 封裝的好處**
- **二、繼承(Inheritance)**
- **1. 什么是繼承?**
- **2. 代碼示例**
- **3. 繼承的注意事項**
- **三、多態(Polymorphism)**
- **1. 什么是多態?**
- **2. 方法重寫(Override)**
- **3. 向上轉型(Upcasting)**
- **4. 多態的優勢**
- **四、總結與對比**
- **五、常見問題**
- **1. 方法重載(Overload) vs 方法重寫(Override)**
- **2. 什么時候用繼承?**
📃文章前言
- 🔷文章均為學習工作中整理的筆記。
- 🔶如有錯誤請指正,共同學習進步。
JavaSE核心知識點02面向對象編程02-02(封裝、繼承、多態)
好的!封裝、繼承和多態是面向對象編程(OOP)的三大核心特性,理解它們對掌握Java至關重要。我會用通俗易懂的方式為你講解,并結合代碼示例幫助你理解。
一、封裝(Encapsulation)
1. 什么是封裝?
- 定義:將數據(屬性)和操作數據的方法(行為)捆綁在一個類中,并對外隱藏內部實現細節。
- 核心思想:隱藏對象的屬性和實現細節,僅對外公開接口(方法)進行交互。
- 目的:提高安全性、可維護性、靈活性(例如:避免屬性被隨意修改)。
2. 如何實現封裝?
- 使用訪問修飾符控制屬性的可見性:
private
:屬性只能在當前類內訪問。public
:屬性或方法可以被任何類訪問。protected
:允許子類和同包類訪問。
- 提供公共的getter和setter方法操作屬性。
3. 代碼示例
public class Student {// 私有屬性,外部無法直接訪問private String name;private int age;// 公共的getter方法,允許外部獲取屬性值public String getName() {return name;}// 公共的setter方法,允許外部設置屬性值(可添加校驗邏輯)public void setName(String name) {if (name != null && !name.isEmpty()) {this.name = name;}}public int getAge() {return age;}public void setAge(int age) {if (age >= 0 && age <= 120) { // 校驗年齡合法性this.age = age;}}
}// 使用示例
public class Main {public static void main(String[] args) {Student stu = new Student();stu.setName("Alice");stu.setAge(20);System.out.println(stu.getName() + ": " + stu.getAge());}
}
4. 封裝的好處
- 安全性:防止屬性被非法修改(如年齡為負數)。
- 靈活性:可以在setter方法中添加校驗邏輯,而外部調用者無需關心。
- 代碼維護:修改類的內部實現時,不影響外部代碼。
二、繼承(Inheritance)
1. 什么是繼承?
- 定義:子類(派生類)繼承父類(基類)的屬性和方法,并可以擴展自己的功能。
- 核心思想:代碼復用 + 擴展功能。
- 語法:使用
extends
關鍵字。
2. 代碼示例
// 父類:Animal
class Animal {private String name;public void eat() {System.out.println(name + " is eating.");}public void setName(String name) {this.name = name;}
}// 子類:Dog(繼承Animal)
class Dog extends Animal {// 擴展自己的方法public void bark() {System.out.println("Woof! Woof!");}
}// 使用示例
public class Main {public static void main(String[] args) {Dog dog = new Dog();dog.setName("Buddy");dog.eat(); // 調用父類方法dog.bark(); // 調用子類方法}
}
3. 繼承的注意事項
- 單繼承:Java中一個類只能直接繼承一個父類(不支持多繼承)。
- 構造方法:子類構造方法默認會調用父類的無參構造方法(可通過
super()
顯式調用父類構造方法)。 - 方法重寫(Override):子類可以重寫父類的方法(后面多態中詳細講解)。
三、多態(Polymorphism)
1. 什么是多態?
- 定義:同一操作作用于不同對象,可以有不同的行為(例如:同一方法在不同子類中有不同實現)。
- 兩種形式:
- 編譯時多態(靜態多態):方法重載(Overload)。
- 運行時多態(動態多態):方法重寫(Override) + 向上轉型(Upcasting)。
2. 方法重寫(Override)
- 子類重新定義父類中已有的方法。
- 規則:
- 方法名、參數列表必須與父類方法相同。
- 返回類型可以是父類方法返回類型的子類。
- 訪問權限不能比父類方法更嚴格。
class Animal {public void makeSound() {System.out.println("Animal makes a sound");}
}class Dog extends Animal {@Override // 注解:表示重寫父類方法public void makeSound() {System.out.println("Dog barks: Woof!");}
}class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("Cat meows: Meow~");}
}
3. 向上轉型(Upcasting)
- 將子類對象賦值給父類引用變量。
- 目的:通過父類引用調用子類重寫的方法,實現多態。
public class Main {public static void main(String[] args) {Animal animal1 = new Dog(); // 向上轉型Animal animal2 = new Cat();animal1.makeSound(); // 輸出 Dog barks: Woof!animal2.makeSound(); // 輸出 Cat meows: Meow~}
}
4. 多態的優勢
- 代碼擴展性:新增子類時無需修改原有代碼。
- 統一接口:用父類引用處理不同子類對象。
四、總結與對比
特性 | 核心思想 | 關鍵實現方式 |
---|---|---|
封裝 | 隱藏細節,暴露接口 | private 屬性 + getter/setter |
繼承 | 代碼復用,擴展功能 | extends 關鍵字 + 方法重寫 |
多態 | 同一方法不同表現 | 方法重寫 + 向上轉型 |
五、常見問題
1. 方法重載(Overload) vs 方法重寫(Override)
- 重載:同一類中,方法名相同,參數列表不同。
- 重寫:子類中重新實現父類方法。
2. 什么時候用繼承?
- 符合 “is-a” 關系時(例如:Dog is a Animal)。
- 避免過度繼承(優先考慮組合而非繼承)。
通過這三個特性,你可以設計出靈活、可維護的Java程序。建議結合代碼實踐,嘗試自己編寫一些類,體會它們之間的關系!
📜文末寄語
- 🟠關注我,獲取更多內容。
- 🟡技術動態、實戰教程、問題解決方案等內容持續更新中。
- 🟢《全棧知識庫》技術交流和分享社區,集結全棧各領域開發者,期待你的加入。
- 🔵?加入開發者的《專屬社群》,分享交流,技術之路不再孤獨,一起變強。
- 🟣點擊下方名片獲取更多內容🍭🍭🍭👇