java複習第2天---2.2---多態

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章