JAVA_面向對象_多態

  1. 多態圖解在這裏插入圖片描述
  2. 代碼中體現多態性

    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
        }
    }
    
  3. 多態中成員變量的特點

    訪問成員變量的兩種方式:

    1. 直接通過對象名稱訪問成員變量:看等號左邊是誰,優先用誰,沒有則向上找

    2. 間接通過成員方法訪問成員變量:看該方法屬於誰,優先用誰,沒有則向上找

      指的是 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
        }
    }
    
  4. 多態中成員方法的特點

    看 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();  // 錯誤寫法
        }
    }
    
  5. 對象轉型圖解在這裏插入圖片描述
  6. 對象的向上轉型
    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
        }
    }
    
  7. 對象的向下轉型

    向上轉型有一個弊端:對象一旦向上轉型爲父類,那麼就無法調用子類原本特有的內容

    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;
    }
    
  8. 綜合案例(筆記本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
        }
    }
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章