多態
可以理解爲一個事物的多種形態,也就是說一個子類對象既可以給子類成員賦值,也可以給父類的成員賦值。
多態的最終體現爲父類的引用變量指向子類對象。
多態的前提是必須有子父類關係或者是實現接口的關係,否二無法完成多態。
在創建多態的父類引用變量調用方法時,運行的是子類重寫後的方法。Person p = new Student();p.show();該方法調用的是子類重寫後的方法
多態的定義格式
定義多態對象的格式:
類的定義:父類類型 對象名 = new 子類對象();
對象名.方法();//調用後必須是子類重寫後的方法
抽象類的定義:抽象類父類類型 對象名 = new 子類對象();
對象名.方法();//調用後必須是子類重寫後的方法
接口的定義格式:接口類型 對象名 = new 實現類對象();
對象名.方法();//調用後必須是子類重寫後的方法
多態中成員的特點
多態中成員變量的特點:
編譯時,看父類中有沒有這個變量,如果有,編譯成功,沒有,編譯失敗
運行時,運行的是父類中的變量
簡言之,編譯運行都父類
多態中成員方法的特點:
編譯時,看父類中有沒有這個方法,如果有,編譯成功,沒有,編譯失敗
運行時,運行的是子類中重寫後的方法。
簡言之,編譯看走邊,運行看右邊
instanceof關鍵字
該關鍵字的作用:用於引用數據類型的比較判斷,創建一個多態對象,比較這個對象是不是子類對象,比如:Person p = new Student();判斷這個p是不是Student對象,如果是,返回true,不是返回false,格式如下:
//創建子類的多態對象
Person p = new Student();
//判斷這個P是不是Student類
boolean b = p instanceof Student;
結果返回的是true
boolean b = p instanceof Teacher;
運行返回的是false
多態的轉型
多態和基本數據類型一樣,都需要數據的轉型,但稍有區別。
向上轉型(自動提升):這種情況不需要我們自己操作,它會自動進行轉型,比如
Person p = new Student();
p.sleep();
他會自動轉型,這種的缺點在於,只能調用他們的公共方法,子類特有的方法不能調用,這時就需要對該類型進行向下轉型
向下轉型(強制轉換):
Person p = new Student();
Student s = (Student)p;
s.study();
這樣就可以調用子類特有的學習方法了。
多態轉型的案例
l 動物類
package cn.itcast.duotai; /* * 定義一個抽象的動物類 * 定義一個抽象的吃的方法 */ public abstract class Animal { //定義一個抽象的吃的方法 public abstract void eat(); }
l 貓類
package cn.itcast.duotai; /* * 定義貓的類繼承動物類 * 重寫父類吃的方法 * 定義貓特有的方法 */ public class Cat extends Animal{ //重寫父類吃的方法 public void eat(){ System.out.println("貓吃貓糧"); } //定義貓特有的方法 public void catchMice(){ System.out.println("貓會抓老鼠"); } }
l 狗類
package cn.itcast.duotai; /* * 定義狗的類繼承動物類 * 重寫動物類吃的方法 * 定義狗特有的方法 */ public class Dog extends Animal{ //重寫動物類吃的方法 public void eat(){ System.out.println("狗吃狗糧"); } //定義狗特有的方法 public void lookHome(){ System.out.println("狗會看家"); } }
l 測試類
package cn.itcast.duotai; /* * 測試類 * 創建貓,狗的多態對象,調用他們特有的方法 * 將對象進行強制轉換,調用貓,狗特有的方法 */ public class Test { public static void main(String[] args) { //創建貓,狗的多態對象,調用他們特有的方法 Animal a1 = new Cat(); Animal a2 = new Dog(); a1.eat(); a2.eat(); //將對象進行強制轉換,調用貓,狗特有的方法 Cat c = (Cat)a1; c.catchMice(); Dog d = (Dog)a2; d.lookHome(); } }
案例
電腦的功能是開機,關機功能,它有USB接口,可以接入許多的外接設備,比如鍵盤,鼠標,將這個事物在代碼中體現出來:
l 電腦類
package cn.itcast.computerDemo; /* * 定義電腦類 * 功能:打開電腦,關閉電腦,調用USB的功能 */ public class Computer { //打開電腦 public void openComputer(){ System.out.println("開啓電腦"); } //關閉電腦 public void closeComputer(){ System.out.println("關閉電腦"); } //調用USB的功能 public void useUSB(USB usb){ usb.open(); usb.close(); } }
l USB接口類
package cn.itcast.computerDemo; /* * 定義usb接口 * 抽象概念,打開,關閉 */ public interface USB { public abstract void open(); public abstract void close(); }
l 鼠標類
package cn.itcast.computerDemo; /* * 定義鼠標類實現接口 * 重寫接口功能 */ public class Mouse implements USB{ public void open(){ System.out.println("打開鼠標"); } public void close(){ System.out.println("關閉鼠標"); } }
l 鍵盤類
package cn.itcast.computerDemo; /* * 定義鍵盤類實現接口類 * 重寫接口中的方法 */ public class keyBoard implements USB{ //重寫接口中的方法 public void open(){ System.out.println("打開鍵盤"); } public void close(){ System.out.println("關閉鍵盤"); } }
l 測試類
package cn.itcast.computerDemo; /* * 測試類 */ public class Test { public static void main(String[] args) { //創建電腦的對象 Computer c = new Computer(); c.openComputer(); //調用鼠標的功能 c.useUSB(new Mouse()); //調用鍵盤的功能 c.useUSB(new keyBoard()); c.closeComputer(); } }