完成目標:
學習java下半段課程
知識點:
1.多態轉型
知識點 | 核心內容 | 重點 |
多態轉型 | 向上轉型(父類引用指向子類對象) 與向下轉型(強制類型轉換)的機制與區別 | 向上轉型自動完成,向下轉型需顯式強轉 |
向上轉型 | 類似double b = 1的小類型自動提升為大類型 | 多態調用時無法使用子類特有方法 |
向下轉型 | 通過強制轉換(如 Dog dog = (Dog) animal)恢復子類類型以調用特有功能 | 類型不匹配會拋出ClassCastException |
轉型應用場景 | 需調用子類特有功能時(如dog.lookDoor())必須向下轉型 | 轉型前建議用instanceof檢查類型安全性 |
2.多態實例
定義筆記本類,具備開機,關機和使用USB設備的功能。具體是什么USB設備,筆記本并不關心,只要符合USB規格的設備都可以。鼠標和鍵盤要想能在電腦上使用,那么鼠標和鍵盤也必須遵守USB規范,不然鼠標和鍵盤的生產出來無法使用;
進行描述筆記本類,實現筆記本使用USB鼠標、USB鍵盤
- USB接口,包含開啟功能、關閉功能
- 筆記本類,包含運行功能、關機功能、使用USB設備功能
- 鼠標類,要符合USB接口
- 鍵盤類,要符合USB接口
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 void click(){System.out.println("點我");}
}public class KeyBoard implements USB{@Overridepublic void open() {System.out.println("鍵盤開啟");}@Overridepublic void close() {System.out.println("鍵盤關閉");}//特有功能public void input(){System.out.println("敲我");}
}public class NoteBook {//開機public void start(){System.out.println("開機");}//使用USB/*USB usb = mouse 多態USB usb = keyBoard 多態*/public void useUSB(USB usb){if (usb instanceof Mouse){Mouse mouse = (Mouse) usb;mouse.open();mouse.click();mouse.close();}else{KeyBoard keyBoard = (KeyBoard) usb;keyBoard.open();keyBoard.input();keyBoard.close();}//usb.open();//usb.close();}//關機public void stop(){System.out.println("關機");}
}public class Test01 {public static void main(String[] args) {NoteBook noteBook = new NoteBook();Mouse mouse = new Mouse();noteBook.start();noteBook.useUSB(mouse);noteBook.stop();System.out.println("===========");KeyBoard keyBoard = new KeyBoard();noteBook.start();noteBook.useUSB(keyBoard);noteBook.stop();}
}
知識點 | 核心內容 | 重點 |
USB接口設計 | 定義抽象接口包含open()和close()方法,要求設備類(鼠標/鍵盤)必須實現 | 接口與實現類的多態調用關系 |
筆記本類功能 | 包含開機、關機、使用USB設備方法(useUSB),通過多態調用不同設備的接口方法 | useUSB方法參數類型為接口,需理解多態的實際應用 |
設備類實現 | 鼠標類(Mouse)和鍵盤類(Keyboard)實現USB接口,并重寫open/close方法 | 特有方法(如click()、input())需通過向下轉型調用 |
多態與類型判斷 | 在useUSB中通過instanceof判斷設備類型,安全調用特有功能 | 避免直接強轉導致的類型轉換異常 |
案例流程 | 1. 開機 → 2. 插入設備(觸發接口方法) → 3. 調用特有功能 → 4. 關機 | 執行順序與多態調用的聯動邏輯 |
3.權限修飾符
知識點 | 核心內容 | 重點 |
權限修飾符 | Java中四種訪問權限:public(公共)、protected(受保護)、default(默認)、private(私有) | default不能顯式聲明,僅在接口中隱式使用 |
同類訪問 | 四種權限修飾的成員在同類中均可訪問 | 無特殊限制 |
同包不同類 | public/protected/default可訪問,private不可訪問 | protected與default易混淆(同包時行為相同) |
不同包子父類 | public/protected可訪問,default/private不可訪問 | protected跨包需繼承關系 |
不同包非子父類 | 僅public可訪問,其余均不可 | 實際開發中優先用public和private |
開發實踐 | 屬性用private(封裝)、方法用public、構造方法用public | private構造方法會阻止實例化 |
4.final
知識點 | 核心內容 | 重點 |
final修飾類 | 使類不能被繼承(最終類) | public final class 類名 語法格式 |
final修飾方法 | 使方法不能被重寫 | 與abstract關鍵字沖突(不能同時使用) |
final修飾局部變量 | 變量成為常量(不可二次賦值) | 聲明時可以不初始化(但首次賦值后不可更改) |
final修飾對象 | 對象引用地址不可變(但屬性值可修改) | setter方法仍可修改對象屬性 |
final修飾成員變量 | 必須顯式初始化且不可二次賦值 | 會導致有參構造和setter方法失效 |
final關鍵字的本質 | 表示"最終的"、"不可改變的"特性 | 不同修飾對象的不可變性表現差異(類/方法/變量) |
5.代碼塊
知識點 | 核心內容 | 重點 |
構造代碼塊 | 格式:{ }內直接寫代碼; 執行特點:優先于構造方法執行,每次創建對象時都會執行 | 與構造方法的執行順序關系 |
靜態代碼塊 | 格式:static { }; 執行特點:優先于構造代碼塊和構造方法,且僅執行一次 | 與構造代碼塊的執行順序及次數差異 |
靜態代碼塊應用場景 | JDBC連接數據庫的四大參數初始化: 1. 注冊驅動; 2. 數據庫地址; 3. 用戶名; 4. 密碼; (需最早初始化且僅一次) | 為何不重復初始化?靜態代碼塊的不可替代性 |
代碼塊對比 | 靜態代碼塊 vs 構造代碼塊: - 執行時機:靜態>構造>構造方法; - 執行次數:靜態(1次) vs 構造(N次) | 實際開發中優先使用靜態代碼塊 |
6.內部類
知識點 | 核心內容 | 重點 |
內部類定義 | 類內部定義的類,用于描述外部類中需要完整結構(屬性和行為)的成員 | 區分內部類與嵌套類概念 |
使用場景 | 當外部類某成員需獨立屬性和行為,且僅服務于外部類時(如人類與心臟) | 理解“只為外部事物提供服務”的核心邏輯 |
JAVA語法規則 | 類A包含類B時,A為外部類,B為內部類(class A { class B {...} }) | 靜態/非靜態成員內部類的語法差異 |
內部類分類 | 成員內部類(靜態/非靜態)、局部內部類、匿名內部類(重點) | 匿名內部類的實際應用場景(如事件監聽) |
案例 | 人的心臟作為內部類,需獨立描述跳動頻率、供血功能等屬性和行為 | 類比其他生物結構(如汽車與發動機) |
7.成員內部類
知識點 | 核心內容 | 重點 |
靜態成員內部類 | 定義時添加static關鍵字(如static class B),可包含屬性/方法/構造器,支持final或abstract修飾(不可同時使用) | 靜態內部類不能調用外部類非靜態成員;權限修飾符使用規則與外部類相同 |
非靜態成員內部類 | 定義時不加static,其余結構與靜態內部類類似 | 調用方式需通過外部類實例 (new Outer().new Inner()) |
調用方式對比 | 靜態內部類:Outer.Inner obj = new Outer.Inner(); 非靜態內部類:Outer.Inner obj = new Outer().new Inner() | 語法差異:非靜態需先實例化外部類 |
修飾符限制 | final修飾后不可繼承;abstract修飾后不可實例化 | 注意final與abstract互斥性 |
實際應用示例 | Person.Heart靜態內部類模擬心臟跳動方法(jump()) | 通過Person.Heart heart = new Person.Heart()調用 |
8.局部內部類
知識點 | 核心內容 | 重點 |
局部內部類 | 定義在方法、代碼塊或構造器中的內部類,作用域與局部變量一致 | 外部類無法直接實例化局部內部類,需通過封裝方法間接調用 |
匿名內部類 | 局部內部類的特殊形式,無顯式類名,直接通過接口/父類實例化 | 語法糖特性,需理解new 接口(){...}的底層實現邏輯 |
調用限制 | 局部內部類僅能在定義它的方法/塊內實例化,外部需通過封裝方法(如eat())間接調用 | 成員內部類 vs 局部內部類的實例化權限差異 |
語法示例 | class Heart { void jump() {...} } 在eat()方法內定義, 通過new Heart().jump()調用 | 方法內定義的類不能使用static修飾 |
9.局部內部類實際操作
知識點 | 核心內容 | 重點 |
局部內部類的實際操作 | 實際操作復雜,需通過接口、抽象類作為方法參數傳遞和返回值返回來理解 | 局部內部類的實際操作方式 |
接口作為方法參數傳遞 | 定義接口類型,實現類實現接口并重寫方法,方法參數傳遞接口類型,實際傳遞的是實現類對象 | 接口不能直接實例化,需傳遞實現類對象 |
接口作為方法返回值 | 方法返回值類型為接口類型,實際返回的是接口的實現類對象 | 返回值類型與實際返回對象類型的區別 |
抽象類作為方法參數傳遞 | 抽象類不能實例化,方法參數傳遞抽象類類型,實際傳遞的是其子類對象 | 抽象類與子類對象的傳遞關系 |
抽象類作為方法返回值 | 方法返回值類型為抽象類類型,實際返回的是其子類對象 | 抽象類作為返回值類型的理解 |
普通類作為方法參數和返回值 | 普通類作為方法參數傳遞的是對象,作為方法返回值返回的也是對象 | 普通類對象的傳遞與返回 |
接口作為方法參數傳遞,實際傳遞的是實現類對象 ;
接口作為方法返回值,實際返回的是接口的實現類對象:
public interface USB {public abstract void open();
}public class Mouse implements USB{@Overridepublic void open() {System.out.println("鼠標打開");}
}public class Test01 {public static void main(String[] args) {Mouse mouse = new Mouse();method(mouse);System.out.println("================");USB usb = method01();//USB usb = new Mouse();usb.open();}/*接口作為方法參數,傳遞實參時,傳遞的是實現類對象*/public static void method(USB usb){//USB usb = mouse -> 多態usb.open();}/*接口作為返回值類型返回,實際返回的是實現類對象*/public static USB method01(){//Mouse mouse = new Mouse();//return mouse;return new Mouse();}
}
抽象類作為方法參數傳遞,實際傳遞的是其子類對象;
抽象類作為方法返回值,實際返回的是其子類對象:
public abstract class Animal {public abstract void eat();
}public class Dog extends Animal{@Overridepublic void eat() {System.out.println("狗啃骨頭");}
}public class Test02 {public static void main(String[] args) {Dog dog = new Dog();method01(dog);System.out.println("=================");Animal animal = method02();//Animal animal = new Dog()animal.eat();}public static void method01(Animal animal){//Animal animal = doganimal.eat();}public static Animal method02(){return new Dog();}
}
普通類作為方法參數傳遞的是對象,作為方法返回值返回的也是對象
public class Person {public void eat(){System.out.println("人要干飯");}
}public class Test03 {public static void main(String[] args) {Person person = new Person();method01(person);System.out.println("==================");Person person1 = method02();//Person person1 = new Person()person1.eat();}public static void method01(Person person){person.eat();}public static Person method02(){return new Person();}
}
10.匿名內部類
知識點 | 核心內容 | 重點 |
匿名內部類定義 | 沒有顯示聲明類名的內部類,編譯時會隱式生成對應class文件 | 與局部內部類的命名區別 |
使用場景 | 單次調用接口方法時替代傳統四步實現方式(創建實現類→重寫方法→實例化→調用) | 與傳統實現方式的步驟對比 |
語法格式 | new 接口/抽象類 ( ) { 重寫方法 }.重寫的方法();? ? 代表實現類/子類對象 | 匿名對象與有名對象的調用區別 |
編譯機制 | 每個new操作會在編譯時生成獨立class文件(示例中生成2個匿名類文件) | 類文件命名規則與生成邏輯 |
典型應用 | USB接口案例:通過匿名內部類同時完成實現和實例化 | open()/close()方法的多重調用限制 |
優劣對比 | 優勢:簡化單次調用代碼;劣勢:復雜邏輯可讀性差 | 與Lambda表達式的適用場景差異 |
11.匿名內部類在開發中的使用
知識點 | 核心內容 | 重點 |
匿名內部類作為參數傳遞 | 通過method01(USB usb)方法演示,直接傳入new USB(){...}匿名內部類對象,替代傳統實現類實例化 | 匿名內部類語法格式(new 接口/抽象類(){...})與常規實現類的區別 |
匿名內部類作為返回值 | 在method01()中直接返回new USB(){...}對象,調用時通過USB usb = method01(); usb.open();執行 | 返回值類型需匹配接口,匿名內部類對象需完整實現抽象方法 |
執行流程解析 | 1. 調用方法 → 2. 傳遞/返回匿名內部類對象(本質為實現類實例) → 3. 調用重寫方法(如open()) | 對象生命周期:匿名內部類對象僅在調用時創建,無顯式類定義 |
匿名內部類作為參數傳遞
匿名內部類作為返回值
12.API文檔
知識點 | 核心內容 | 重點 |
API定義 | Application Programming Interface(應用編程接口),包含預定義的類、接口及其成員方法 | 需區分API與API文檔的概念差異 |
API文檔作用 | 程序員離線查詢工具,支持按類/包檢索方法說明 (如Scanner類的方法參數與返回值) | 必須掌握類名/包名才能有效查詢,否則需依賴網絡搜索 |
API文檔結構 | 包含: 1. 類繼承體系(如Scanner→Object); ? ? ? ? ? ? 2. 實現接口(如Iterator); ? 3. 方法詳情(返回值類型/參數/功能說明) | 重點查看方法簽名(如void close())和功能描述字段 |
文檔使用技巧 | 1. 通過索引搜索類名(不區分大小寫); 2. 任務欄快捷訪問配置(右鍵→工具欄→新建工具欄) | 高頻易錯:直接搜索方法名無效,需通過類名定位 |
離線查詢優勢 | 無網絡環境下仍可快速檢索已知類的方法細節(如Scanner.nextInt()的異常處理) | 對比百度搜索,精準性更高但前提條件嚴格 |
13.異常
知識點 | 核心內容 | 重點 |
異常概念 | 代碼運行中出現的不正常現象,分為錯誤(Error)和異常(Exception) | 異常≠語法錯誤,異常是運行時問題而非語法問題 |
異常體系結構 | Throwable(可拋的)為頂級父類,包含Error和Exception兩個子類 | Error代表重大錯誤(如內存溢出),Exception代表可處理問題 |
異常分類 | 編譯時期異常(檢查型異常) vs 運行時期異常(非檢查型異常) | 編譯異常:代碼編譯時報錯;運行異常:運行時才報錯 |
編譯時期異常 | Exception類及其子類(除RuntimeException分支) | 典型特征:調用方法時底層拋出,如SimpleDateFormat的parse() |
運行時期異常 | RuntimeException及其子類(如數組越界異常) | 典型特征:編譯不報錯但運行時報錯 |
異常處理機制 | 異常未被處理時會自動向上拋出,最終由JVM默認處理 | 處理流程:打印異常堆棧 → 終止程序執行 |
典型錯誤示例 | 遞歸調用導致棧溢出(StackOverflowError) | Error不可恢復,必須重構代碼 |
典型異常示例 | 數組越界(ArrayIndexOutOfBoundsException) vs 日期解析異常(ParseException) | 運行異常不強制處理,編譯異常必須處理 |