天天看點

四葉草:多态

多态概述:

為三大特性之一

先講下封裝與繼承:封裝就是把過程和資料包圍起來,對資料的通路隻能通過已定義的界面,他把實作的細節隐藏起來,比如你在Java中去實作一個類,這個類提供了一些功能方法,你隻需要知道傳遞到什麼樣的參數,會達到什麼樣的效果,實作細節在類中定義好了。進而實作代碼子產品化;而繼承可以擴充已存在的代碼子產品,而且就是為了代碼重用。那麼多态除了代碼的複用,還可以解耦。而且為什麼要解耦?耦合度是子產品與子產品之間,代碼與代碼之間的關聯度,通過對系統的分析把他分解成一個又一個子子產品,子子產品提供穩定的接口,達到降低系統耦合度的目的,子產品與子產品之間盡量使用子產品接口通路,而不是引用其他子產品的的成員變量。

多态好處:

1、程式不必為每一個派生類編寫調用功能,隻需要對抽象基類進行處理即可。大大提高程式的複用性。//繼承

2、派生類的功能可以被基類的方法引用或引用變量所調用,這叫做向後相容,可以提高可擴充性。//多态的真正作用。現實事事物表現出多種形态,如汽車,是代步工具的一種,則一個具體的一輛車五菱宏光既是是汽車,又是代步工具,即出現兩種形态

簡單粗暴:

父類型引用子類型的對象。

同一操作作用于不同的對象,可以産生不同的結果。

對同一個對象表現出不同的形态。

Java是面向對象的語言,同樣可以描述一個事物的多種形态。如汽車類繼承了代步工具類,一個汽車的對象便既是汽車又是代步工具。

多态展現為父類引用變量可以指向子類對象

前提條件:必須有子父類關系

注意:在使用多态後的父類引用變量調用方法時,會調用子類重寫後的方法。

多态的定義與使用格式

定義格式: 父類類型  變量名 = new子類類型()

了解:

多态是同一行為具有不同的表現形式或者形态的能力。

多态就是一個接口,使用不同的執行個體而執行不同操作。

多态成員的特點

1、多态成員變量:編譯和運作都看左邊

Fu f = new Zi();

sout(f.num);//f是Fu的值,隻能取到父中的值

2、多态成員方法:編譯看左邊,運作看右邊

Fu f1=new Zi();

sout(f1.show());//f1的門面類型是Fu,但是實際類型是Zi,是以調用的是重寫後的方法。

3、instanceof關鍵字

作用:用來判斷某個對象是否屬于某種資料類型。

注意:傳回類型為布爾類型

使用案例:

Fu f1=new Zi();
        Fu f2=new Son();
        if(f1 instanceof Zi){
            System.out.println("f1是Zi的類型");
        }
        else{
            System.out.println("f1是Son的類型");


        }
           

多态的轉型:

多态的轉型分為向上轉型和向下轉型兩種。

向上轉型:多态本身就是向上轉型的過程

使用格式:父類類型 變量名=new 子類類型();

使用場景:當不需要面對子類類型時,通過提高擴張性,或者使用父類的功能就能完成相應的操作。

向下轉型:一個已經向上轉型的對象可以使用強制類型轉換的格式,将父類類型轉為子類引用類型

轉為子類引用各類型

使用格式:子類類型: 子類類型 變量名=(子類類型)父類類型的變量;

使用場景:當要使用子類的特有功能時。

package day0524;
 
public class demo04 {
    public static void main(String[] args) {
        People p=new Stu();
        p.eat();
        //調用特有的方法
        Stu s=(Stu)p;
        s.study();
        //((Stu) p).study();
    }
}
class People{
    public void eat(){
        System.out.println("吃飯");
    }
}
class Stu extends People{
    @Override
    public void eat(){
        System.out.println("吃水煮肉片");
    }
    public void study(){
        System.out.println("好好學習");
    }
}
class Teachers extends People{
    @Override
    public void eat(){
        System.out.println("吃櫻桃");
    }
    public void teach(){
        System.out.println("認真授課");
    }
}
           
package qingfeng;
public class demo1 {
    public static void main(String[] args) {
        A a=new A();
        a.show();
        B b=new B();
        b.show();
    }
}
class A{
    public void show(){
        show2();
    }
    public void show2(){
        System.out.println("A");
    }
}
class B extends A{
    public void show2(){
        System.out.println("B");
    }
}
class C extends B{
    public void show(){
        super.show();
    }
    public void show2(){
        System.out.println("C");
    }
}
           

輸出結果A B