完成目標:
?
知識點:
1.抽象注意事項
知識點 | 核心內容 | 重點 |
抽象類實例化限制 | 抽象類不能直接實例化對象,只能創建非抽象子類的對象 | 嘗試實例化抽象類會觸發編譯錯誤 |
抽象方法與抽象類關系 | 抽象類不一定包含抽象方法,但含抽象方法的類必須是抽象類 | 定義順序影響類聲明(先有抽象方法需聲明抽象類) |
子類重寫要求 | 子類必須重寫父類所有抽象方法,否則需聲明為抽象類 | 漏寫重寫方法等價于隱含繼承父類抽象方法 |
抽象類成員結構 | 可包含成員變量/構造方法/普通方法,與普通類差異僅在于抽象方法 | 構造方法用于子類初始化父類屬性(非自身實例化) |
構造方法作用機制 | 抽象類構造方法專用于子類對象初始化時設置父類屬性 | 通過super()調用父類構造方法實現屬性傳遞 |
2.抽象實例
某IT公司有多名員工,按照員工負責的工作不同,進行了部門的劃分(研發部、維護部)。
研發部(Developer)根據所需研發的內容不同,又分為 JavaEE工程師 、Android工程師 ;
維護部(Maintainer)根據所需維護的內容不同,又分為 網絡維護工程師(Network) 、硬件維護工程師(Hardware) 。
公司的每名員工都有他們自己的員工編號、姓名,并要做它們所負責的工作。
工作內容:
- JavaEE工程師: 員工號為xxx的 xxx員工,正在研發電商網站
- Android工程師:員工號為xxx的 xxx員工,正在研發電商的手機客戶端軟件
- 網絡維護工程師:員工號為xxx的 xxx員工,正在檢查網絡是否暢通
- 硬件維護工程師:員工號為xxx的 xxx員工,正在修復電腦主板
根據描述,完成員工體系中所有類的定義,并指定類之間的繼承關系。進行XX工程師類的對象創建,完成工作方法的調用。
public abstract class Employee {private int id;private String name;public Employee() {}public Employee(int id, String name) {this.id = id;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public abstract void work();
}```
public abstract class Developer extends Employee{
}
public class JavaEE extends Developer{@Overridepublic void work() {//System.out.println("員工號為:"+getId()+"的"+getName()+"正在開發網站");System.out.println("員工號為:"+this.getId()+"的"+this.getName()+"正在開發網站");}
}
public class Android extends Developer{@Overridepublic void work() {//System.out.println("員工號為:"+getId()+"的"+getName()+"正在開發app");System.out.println("員工號為:"+this.getId()+"的"+this.getName()+"正在開發app");}
}
public class Test01 {public static void main(String[] args) {JavaEE javaEE = new JavaEE();javaEE.setId(1);javaEE.setName("濤哥");javaEE.work();System.out.println("===============");Android android = new Android();android.setId(2);android.setName("金蓮");android.work();}
}
3.接口
知識點 | 核心內容 | 重點 |
接口定義 | 使用interface關鍵字定義引用數據類型,是一種標準/規范 | 接口與抽象類的區別; 接口成員默認修飾符規則 |
接口實現 | 通過implements關鍵字創建實現類; 必須重寫所有抽象方法 | 實現類與子類概念區分; 接口不能直接實例化 |
JDK7接口特性 | 僅包含: - public abstract抽象方法; - public static final常量 | 抽象方法修飾符可省略; 常量必須初始化 |
JDK8新增特性 | 支持: - default默認方法(帶實現); - static靜態方法 | 默認方法沖突解決規則; 靜態方法接口專屬調用方式 |
多態應用 | 通過接口引用指向實現類對象; Mouse m = new Mouse() | 運行時綁定機制; 類型轉換異常風險點 |
生活化案例 | 插座/USB接口類比: - 統一標準; - 強制規范 | 接口設計開閉原則體現; 擴展性vs約束性平衡 |
1.定義接口:
? public interface 接口名{}
2.實現:
? public class 實現類類名 implements 接口名{}
3.使用:
? a.實現類實現接口
? b.重寫接口中的抽象方法
? c.創建實現類對象(接口不能直接new對象)
? d.調用重寫的方法 ? ?
public interface USB {public abstract void open();public abstract void close();
}public class Mouse implements USB{@Overridepublic void open() {System.out.println("鼠標打開");}@Overridepublic void close() {System.out.println("鼠標關閉");}
}public class Test01 {public static void main(String[] args) {Mouse mouse = new Mouse();mouse.open();mouse.close();}
}
4.默認方法?靜態方法
知識點 | 核心內容 | 重點 |
默認方法 | JDK8新增特性,格式為public default 返回值 方法名(),包含方法體實現,可通過實現類對象調用 | 1. 與抽象方法區別:有方法體; 2. 可重寫可不重寫; 3. 必須通過實現類調用 |
靜態方法 | JDK8新增,格式為public static 返回值 方法名(), 直接通過接口名調用 | 1. 不需要實現類; 2. 調用方式與類靜態方法相同 |
應用場景 | 1. 作為臨時添加的小功能; 2. 避免因添加抽象方法導致所有實現類報錯 | 1. 默認方法:功能擴展; 2. 靜態方法:工具類功能 |
語法注意點 | 1. 實現類重寫默認方法時不能加default關鍵字; 2. 靜態方法不能被實現類繼承或重寫 | 1. @Override注解可驗證重寫; 2. 接口靜態方法 vs 類靜態方法調用方式 |
5.接口的成員變量
知識點 | 核心內容 | 重點 |
接口中的成員變量定義 | 使用public static final修飾成員變量(如int NUM=100),默認隱含該修飾,需手動初始化 | final變量的不可變性、默認修飾符規則 |
靜態成員調用方式 | 通過接口名直接調用靜態變量(如USB.NUM) | 接口與類靜態成員調用語法的區別 |
開發規范 | static final修飾的變量名需全大寫(如NUM而非num) | 命名習慣與實際語法約束的差異 |
final關鍵字的特性 | 被修飾變量為常量,禁止二次賦值 | final與普通變量的初始化要求對比 |
6.接口特點和與抽象類的區別
知識點 | 核心內容 | 重點 |
接口特點 | 1. 可以多繼承(一個接口繼承多個接口); 2. 可以多實現(一個類實現多個接口); 3. 子類可同時繼承父類和實現接口 | 接口繼承 vs 類繼承; 類單繼承 vs 接口多繼承 |
接口實現注意事項 | 1. 多個接口抽象方法重名時只需重寫一次; 2. 多個接口默認方法重名時必須重寫 | 抽象方法沖突只需實現一次; 默認方法沖突強制重寫 |
接口與抽象類區別 | 相同點: - 都位于繼承體系頂端; - 都不能實例化; - 都包含抽象方法; 不同點: - 抽象類可包含成員變量/構造方法; - 接口側重功能集合 | 設計定位差異: 抽象類→父類擴展; 接口→功能契約 |
命名規范 | 實現類推薦使用Impl后綴(implements縮寫) | 開發中通過命名快速識別實現類 |
代碼示例 | interface A extends B,C; class Impl implements A,B; class Sub extends Parent implements A,B | 多繼承語法糖寫法 |
7.多態
知識點 | 核心內容 | 重點 |
多態概念 | 面向對象三大特征之一,強調方法重寫和父類引用指向子類對象 | 不要從字面理解"一個事物多種形態",要從使用形式理解 |
多態前提條件 | 1. 必須有子父類繼承或接口實現關系; 2. 必須有方法重寫(無重寫則多態無意義) | 成員變量在多態中無意義,重點關注重寫方法 |
多態實現方式 | 父類類型 變量名 = new 子類構造器(); 類比基本數據類型轉換:double b = 10(大類型接收小類型) | 與常規new對象方式(Dog d = new Dog())的語法區別 |
多態調用限制 | 不能直接調用子類特有功能; 只能調用重寫方法和父類定義的方法 | 與繼承中new父類對象不能調子類方法的規則一致 |
多態應用示例 | Animal a = new Dog(); a.eat()調用的是Dog重寫方法; Animal a2 = new Cat(); a2.eat()調用Cat重寫方法 | 編譯看左邊,運行看右邊的調用機制 |
多態專業術語 | 英文術語:Polymorphic; 代碼特征:抽象類/接口+實現類重寫 | 需區分抽象類與接口的實現方式差異 |
多態實現:
public abstract class Animal {public abstract void eat();
}public class Dog extends Animal{@Overridepublic void eat() {System.out.println("狗啃骨頭");}//特有方法public void lookDoor(){System.out.println("狗會看門");}
}public class Cat extends Animal{@Overridepublic void eat() {System.out.println("貓吃魚");}//特有方法public void catchMouse(){System.out.println("貓會捉老鼠");}
}public class Test01 {public static void main(String[] args) {//原始方式Dog dog = new Dog();dog.eat();//重寫的dog.lookDoor();//特有的Cat cat = new Cat();cat.eat();//重寫的cat.catchMouse();//特有的System.out.println("==================");//多態形式new對象Animal animal = new Dog();//相當于double b = 10animal.eat();//重寫的 animal接收的是dog對象,所以調用的是dog中的eat
// animal.lookDoor(); 多態前提下,不能直接調用子類特有成員Animal animal1 = new Cat();animal1.eat();//cat重寫的}
}
8.多態_成員訪問特點
知識點 | 核心內容 | 重點 |
多態成員的訪問特點 | 成員變量訪問看等號左邊(編譯類型),成員方法調用看new的對象(運行類型) | 成員變量無多態性(輸出1000),成員方法有多態性(輸出子類重寫方法) |
繼承口訣應用 | 成員變量:看左邊(父類);成員方法:看new誰(子類優先) | 易混淆變量與方法的訪問規則差異 |
多態本質 | 主要玩方法重寫,不涉及成員變量的多態性 | 實際開發中強調方法重寫的優先級 |
9.多態的優點
知識點 | 核心內容 | 重點 |
多態的定義與形式 | 父類引用指向子類對象(Animal a = new Dog()),通過父類類型調用子類重寫方法 | 多態與原始方式(Dog d = new Dog())的語法區別 |
多態的優缺點對比 | 優點:擴展性強(父類類型可接收任意子類對象); 缺點:無法直接調用子類特有成員 | 原始方式 vs 多態方式的調用權限差異(重寫/繼承/特有方法) |
擴展性案例 | 方法形參定義為父類類型(void method(Animal a)),可傳遞不同子類對象(Dog/Cat),調用各自重寫方法 | 原始方式需為每個子類單獨定義方法(method(Dog d), method(Cat c)) |
多態的應用場景 | 框架開發、對象傳遞時優先使用多態,核心價值是統一調用重寫方法,而非調用子類特有功能 | 易混淆點:多態并非為調用特有功能設計 |
類型轉換與接收范圍 | 類比double b = 10(大類型接收小類型),多態中父類類型可接收所有子類對象 | 類型不匹配時的編譯錯誤(如Dog d = new Cat()) |
在開發實踐中:多態是許多設計模式的基礎;多數Java框架底層都使用多態機制