-
多態圖解
-
代碼中體現多態性
Format:
父類名稱 對象名 = new 子類名稱();
or
接口名稱 對象名 = new 實現類名稱();
// 父類 public class Father { public void method(){ System.out.println("parent class method call"); } public void methodFather(){ System.out.println("parent class specific method"); // 父類特有方法 } } // 子類 public class Son extends Father{ @Override public void method(){ System.out.println("sub class method call"); } } public class DemoMulti{ public static void main(String[] args){ // 使用多態寫法,左側父類的引用,指向了右側子類的對象(類似於一隻狗被當做了一隻動物) Father son = new Son(); son.method(); // sub class method call son.methodFather(); // parent class specific method } }
-
多態中成員變量的特點
訪問成員變量的兩種方式:
-
直接通過對象名稱訪問成員變量:看等號左邊是誰,優先用誰,沒有則向上找
-
間接通過成員方法訪問成員變量:看該方法屬於誰,優先用誰,沒有則向上找
指的是 Father son = new Son(); 中的等號
口訣:編譯看右邊,運行還看右邊
// 父類 public class Father { String name = "Father"; public String showName() { return this.name; } } // 子類 public class Son extends Father{ String name = "Son"; int age = 20; @Override public String showName() { return this.name; } } public class DemoMulti{ public static void main(String[] args){ // 使用多態寫法,左側父類的引用,指向了右側子類的對象(類似於一隻狗被當做了一隻動物) Father son = new Son(); System.out.println(son.name); // Father // System.out.println(son.age); // 錯誤寫法 // 子類沒有覆蓋重寫,就是父:Father // 子類有覆蓋重寫,就是子:Son System.out.println(son.showName()); // Son } }
-
-
多態中成員方法的特點
看 new 的是誰,就優先用誰,沒有則向上找
口訣:編譯看左邊,運行看右邊
// 父類 public class Father { public void method(){ System.out.println("parent class method call"); } public void methodFather(){ System.out.println("parent class specific method"); // 父類特有方法 } } // 子類 public class Son extends Father{ @Override public void method(){ System.out.println("sub class method call"); } public void methodSon(){ System.out.println("son class specific method"); // 父類特有方法 } } public class DemoMulti{ public static void main(String[] args){ Father son = new Son(); // 多態 son.method(); // 父子都有,優先用子 son.emthodFather(); // 子類沒有,父類有,向上找到父類 // son.methodSon(); // 錯誤寫法 } }
-
對象轉型圖解
-
對象的向上轉型
public abstract class Animal { public abstract void eat(); } public class Cat extends Animal{ @Override public void eat(){ System.out.println("cat eat fish"); } } public class DemoTransition { public static void main(String[] args) { // 對象的向上轉型,就是父類引用 指向 子類對象 Animal cat = new Cat(); cat.eat(); // cat eat fish } }
-
對象的向下轉型
向上轉型有一個弊端:對象一旦向上轉型爲父類,那麼就無法調用子類原本特有的內容
public abstract class Animal { public abstract void eat(); } public class Cat extends Animal{ @Override public void eat(){ System.out.println("cat eat fish"); } public void catchMouse(){ System.out.println("cat catches mouse"); } } public class DemoTransition { public static void main(String[] args) { // 對象的向上轉型,就是父類引用 指向 子類對象 Animal cat = new Cat(); cat.eat(); // cat eat fish // cat.catchMouse(); // 錯誤寫法 // 向下轉型,進行還原 Cat transitionCat = (Cat) cat; transitionCat.catchMouse(); // cat catches mouse } }
用
instanceof
關鍵字進行類型判斷(爲了避免向下轉型異常:ClassCastException
)if (cat instanceof Cat){ Cat transitionCat = (Cat) cat; }
-
綜合案例(筆記本USB接口)
// 定義 USB 接口
public interface USB { void enable(); void disable(); }
// 鼠標實現類
// 鼠標是一種 USB 設備 public class Mouse implements USB { String name = "mouse"; @Override public void enable() { System.out.println("enable " + this.name); } @Override public void disable() { System.out.println("disable " + this.name); } public void click(){ System.out.println("click on the event"); } }
// 鍵盤實現類
// 鍵盤也是一種 USB 設備 public class KeyBoard implements USB { String name = "key board"; @Override public void enable() { System.out.println("enable " + this.name); } @Override public void disable() { System.out.println("disable " + this.name); } public void tap(){ System.out.println("tap on a event"); } }
// 電腦類
public class MacBookPro { public void powerOn() { System.out.println("powerOn"); } public void powerOff() { System.out.println("powerOff"); } // 使用 USB 設備的方法,使用接口作爲方法的參數 public void useDevice(USB usb) { usb.enable(); if (usb instanceof Mouse){ // 向下轉型 Mouse mouse = (Mouse) usb; mouse.click(); } else if (usb instanceof KeyBoard){ KeyBoard keyBoard = (KeyBoard) usb; keyBoard.tap(); } usb.disable(); } }
// main()
public class DemoCase { public static void main(String[] args) { MacBookPro book = new MacBookPro(); USB mouse = new Mouse(); // 多態寫法,向上轉型 KeyBoard keyBoard = new KeyBoard(); // 自動發生了向上轉型 book.powerOn(); // powerOn book.useDevice(mouse); // enable mouse, click on the event, disable mouse // 也可以直接傳匿名對象 new KeyBoard() book.useDevice(keyBoard); // enable key board, tap on a event, disable key board book.powerOff(); // powerOff } }
JAVA_面向對象_多態
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.