Java基礎_11 | 面向對象特性之三 —— 多態(多態的語法規則、多態的實際用途、多態的注意事項)

1.多態的語法規則

多態是面對對象編程思想中的第三大特性,用通俗的話來解釋,多態其實就是:

  • 同樣的一段代碼可以實現不同的功能。

用專業的話來解釋多態:

  • 一個父類的引用類型變量它既可以指向父類對象,也可以指向子類對象(子類的引用類型變量不能指向父類),它可以根據當前時刻指向對象的不同,自動調用不同對象的方法。

舉個例子,在現實生活中,當上課鈴響起後,所有的學生都執行進教室這個相同的操作,但是不同班級的學生會自動進入不同的教室,這就是多態。

多態的測試程序如下:

/**
 * @brief   測試多態的語法規則
 * @author  mculover666
 * @date    2019/4/29
 */
class A
{
    public void fun()
    {
        System.out.println("I am Fun of class A.");
    }
}
class B extends A
{
    /* 重寫父類的fun方法 */
    public void fun()
    {
        System.out.println("I am Fun of class B.");
    }

}
class TestPoly1
{
    public static void main(String[] args) 
    {
        A a1 = new A();
        B b1 = new B();

        a1.fun();   //a1是A類對象的引用,所有調用A類的fun方法
        b1.fun();   //b1是B類對象的引用,所有調用B類的fun方法

        /**
         * 核心知識:多態,同樣的a1.fun(),功能卻不一樣
         */
        a1 = b1;    //將子類的引用發送給父類的引用
        a1.fun();   //a1變成子類B類對象的引用,調用B類的fun方法
    }
}

測試結果:

2.多態的實際用途

多態的實際用途其實就是:相同的一段代碼,實現不同的功能。

問題

A類派生出B類,B類派生出C類,依次派生形成A類的一個族羣,編寫一個函數,調用整個A類族羣所有對象的fun方法。

分析

因爲A類是A類族所有類的父類,所以A類的引用類型變量可以指向A類及A類所有子類的對象,所以使用多態特性編寫的函數如下:

    public static void fun(A aa)
    {
        /**
         * 多態:同樣的代碼,根據aa的指向對象不同,自動調用不同對象的fun方法
         */
        aa.fun();
    }

解決

/**
 * @brief   編寫一個方法,調用整個A類族的fun方法
 * @author  mculover666
 * @date    2019/4/29
 */
class A
{
    public void fun()
    {
        System.out.println("I am Fun of class A.");
    }
}
class B extends A
{
    /* 重寫父類的fun方法 */
    public void fun()
    {
        System.out.println("I am Fun of class B.");
    }
}
class C extends B
{
    /* 重寫父類的fun方法 */
    public void fun()
    {
        System.out.println("I am Fun of class C.");
    }
}
class D extends C
{
    /* 重寫父類的fun方法 */
    public void fun()
    {
        System.out.println("I am Fun of class D.");
    }

}
class TestPoly2
{
    /* 在靜態的main方法中被調用,所以必須爲靜態方法,否則不能被調用 */
    public static void fun(A aa)
    {
        /**
         * 多態:同樣的代碼,根據aa的指向對象不同,自動調用不同對象的fun方法
         */
        aa.fun();
    }
    public static void main(String[] args) 
    {
        A a1 = new A();
        B b1 = new B();
        C c1 = new C();
        D d1 = new D();

        fun(a1);
        fun(b1);
        fun(c1);
        fun(d1);
    }
}

運行結果如下:

3.多態使用時的注意事項

  • 子類對象可以直接賦給父類對象的引用,但是在任何情況下,父類對象都不能直接賦給子類對象的引用;
  • 通過父類引用只能訪問子類從父類繼承過來的成員
  • 通過父類引用不能訪問子類對象特有的成員;
  • 只有在父類的引用本身已經在指向子類對象時,纔可以進行強制轉化,強制將父類引用轉化爲子類引用;

接收更多精彩文章及資源推送,歡迎訂閱我的微信公衆號:『mculover666』

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