java複習第2天---2.2---多態
目錄
文章目錄
內容
1、多態
面向對象三大特性:封裝、繼承和多態。繼承爲多態的前提,通過extends 或者 implements 關鍵字體現。
1.1、格式與使用
-
格式
父類 對象名 = new 子類(); 或者 接口 接口名 = new 實現類();
-
示例1.1-1:
public class Father {...} public interface MyInterface {...} public extends Father implements MyInterface {...} public class MultiTest1 { public static void main(String[] args){ Father f1 = new Son(); MyInterface mi = new Son(); } }
1.2、多態中的成員變量
-
成員變量調用方式
- 子類對象直接調用
- 子類方法間接調用
-
調用順序
- 直接調用:優先調用 = 左邊的成員變量,沒有向上查找。
- 子類方法間接調用:優先調用子類成員變量,沒有向上查找
-
示例1.2-1:
package inherited.Multi; public class Father { int num = 10; public void show() { System.out.println(num); } } package inherited.Multi; public class Son extends Father{ int num = 20; public void show() { System.out.println(num); } } package inherited.Multi; public class TestVar1 { public static void main(String[] args) { Father s1 = new Son(); System.out.println(s1.num); s1.show(); } } 結果: 10 20
1.3、多態中的成員方法
-
調用規則:
- 優先調用子類的成員方法,子類中沒有向上查找
-
示例1.3-1:
package inherited.Multi; public class FatherMulti { public void show() { System.out.println("父類中的show方法"); } public void methodFu() { System.out.println("父類中的特有方法"); } } package inherited.Multi; public class SonMulti extends FatherMulti{ public void show() { System.out.println("子類中的show方法"); } } package inherited.Multi; public class TestMulti1 { public static void main(String[] args) { FatherMulti f1 = new SonMulti(); f1.show(); f1.methodFu(); } } 結果: 子類中的show方法 父類中的特有方法
1.4、多態的優缺點
- 優點:不需要關心子類或者實現類的功能實現細節,當子類或者實現類改變的時候,調用API無需改變。
- 缺點:不能使用子類或者實現類的特有方法,解決方法見向下轉型
1.5、向上向下轉型
- 向上轉型:即我們常用的多態形式,即父類或者接口引用指向子類或者實現類對象。
- 向下轉型:由於父類或者接口引用指向子類或者實現類對象,那麼它就不能使用子類或者實現類的特有方法。如果想使用,那麼需要強制向下轉型,即前面加(子類)。
- 問題:當向下轉型不是原有的類型時,會暴類型轉換錯誤,怎麼解決呢,見instanceof關鍵字
1.6、instanceof關鍵字
-
instanceof: 判斷一個對象是不是某個類的對象
-
格式
對象 instanceof 類 // 結果爲true 或者 false
-
應用:上面提到,當向下轉型時,可能並不是原有的類型是,就可以使用instanceof提前判斷下是不是原有類型。
1.7、接口多態綜合小案例
1.7.1、需求
筆記本電腦(laptop)通常具有使用usb設備的能力。生產時,會預留供usb設備插入的usb接口。生產商不關心是什麼usb設備,只要符合usb接口規範即可。
定義usb接口,具有開啓和關閉的功能。鼠標和鍵盤要想在筆記本電腦上使用,必須遵循ubs接口規範,實現usb接口,否則不能在筆記本電腦上面使用。
1.7.2、分析
描述筆記本類,實現使用鼠標和鍵盤的功能。
- 筆記本類
- 方法:
- 使用usb設備
- 開機
- 關機
- 方法:
- 鼠標類
- 實現usb接口
- 點擊方法
- 鍵盤類
- 實現usb接口
- 敲擊方法
- ubs接口
- 方法
- 開啓設備
- 關閉設備
- 方法
1.7.3、實現
-
筆記本類代碼1.7.3-1:
package inherited.IMCase; public class Laptop { public void powerOn() { System.out.println("開機"); } public void powerOff() { System.out.println("關機"); } /** * 使用USB設備功能 * @param usb usb設備 */ public void useUSBDevice(USB usb) { usb.open(); // 開啓設備 usb.close(); // 關閉設備 } }
-
USB接口代碼1.7.3-2:
package inherited.IMCase; public interface USB { void open(); // 開啓設備 void close(); // 關閉設備 }
-
鼠標類代碼1.7.3-3:
package inherited.IMCase; public class Mouse implements USB{ @Override public void open() { // TODO Auto-generated method stub System.out.println("啓用鼠標"); } @Override public void close() { // TODO Auto-generated method stub System.out.println("停用鼠標"); } public void click() { System.out.println("鼠標點擊"); } }
-
鍵盤類代碼1.7.3-4:
package inherited.IMCase; public class Keyboard implements USB{ @Override public void open() { // TODO Auto-generated method stub System.out.println("啓用鍵盤"); } @Override public void close() { // TODO Auto-generated method stub System.out.println("停用鍵盤"); } public void click() { System.out.println("鍵盤敲擊"); } }
-
測試類代碼1.7.3-5:
package inherited.IMCase; public class IMCaseTest { public static void main(String[] args) { // 1.創建筆記本電腦對象 Laptop lt = new Laptop(); System.out.println("=========="); // 2.調用電腦開機功能 lt.powerOn(); // 3、調用電腦關機功能 lt.powerOff(); System.out.println("=========="); // 4、創建1個鼠標對象 // 4.1、多態形式 USB usb = new Mouse(); // 5、筆記本電腦使用鼠標 lt.useUSBDevice(usb); System.out.println("=========="); // 6、創建鍵盤對象 // 6.1、非多態形式 Keyboard keyboard = new Keyboard(); // 7、筆記本電腦使用鍵盤 lt.useUSBDevice(keyboard); } }
-
結果:
========== 開機 關機 ========== 啓用鼠標 停用鼠標 ========== 啓用鍵盤 停用鍵盤
2、final關鍵字
3、權限修飾符
後記 :
本項目爲參考某馬視頻開發,相關視頻及配套資料可自行度娘或者聯繫本人。上面爲自己編寫的開發文檔,持續更新。歡迎交流,本人QQ:806797785
前端項目源代碼地址:https://gitee.com/gaogzhen/vue-leyou
後端JAVA源代碼地址:https://gitee.com/gaogzhen/JAVA