1. 程式人生 > >多型的使用和概述以及弊端和好處

多型的使用和概述以及弊端和好處

多型的概述

多型的概述

多型:同一個物件(事物),在不同時刻體現出來的不同狀態。
舉例:
    貓是貓,貓是動物。
    水(液體,固體,氣態)。

多型的前提:
    A:要有繼承關係。
    B:要有方法重寫。
        其實沒有也是可以的,但是如果沒有這個就沒有意義。
            動物 d = new 貓();
            d.show();
            動物 d = new 狗();
            d.show();
    C:要有父類引用指向子類物件。

程式碼體現

        父 f =  new 子();
    class Fu {
public int num = 100;
public void show() {
    System.out.println("show Fu");
}
public static void function() {
    System.out.println("function Fu");
    }
}
 class Zi extends Fu {
      public int num = 1000;
    public int num2 = 200;
public void show() {
    System.out.println("show Zi");
}
public void method() {
    System.out.println("method zi");
}
public static void function() {
    System.out.println("function Zi");
}
 }   class DuoTaiDemo {
        public static void main(String[] args) {
                //要有父類引用指向子類物件。
                //父 f =  new 子();
              Fu f = new Zi();
            System.out.println(f.num);
            //找不到符號
            //System.out.println(f.num2);
     f.show();
    //找不到符號
    //f.method();
    f.function();
}

}
多型的程式碼理解

多型的問題理解:
class 孔子爹 {
    public int age = 40;

    public void teach() {
        System.out.println("講解JavaSE");
    }
}

class 孔子 extends 孔子爹 {
    public int age = 20;

    public void teach() {
        System.out.println("講解論語");
    }

    public void playGame() {
        System.out.println("英雄聯盟");
    }
}

//Java培訓特別火,很多人來請孔子爹去講課,這一天孔子爹被請走了
//但是還有人來請,就剩孔子在家,價格還挺高。孔子一想,我是不是可以考慮去呢?
//然後就穿上爹的衣服,帶上爹的眼睛,粘上爹的鬍子。就開始裝爹
//向上轉型
孔子爹 k爹 = new 孔子();
//到人家那裡去了
System.out.println(k爹.age); //40
k爹.teach(); //講解論語
//k爹.playGame(); //這是兒子才能做的


//講完了,下班回家了
//脫下爹的裝備,換上自己的裝備
//向下轉型
孔子 k = (孔子) k爹; 
System.out.println(k.age); //20
k.teach(); //講解論語
k.playGame(); //英雄聯盟

多型的好處

    A:提高了程式碼的維護性(繼承保證)
    B:提高了程式碼的擴充套件性(由多型保證)

多型的弊端

 不能使用子類的特有功能。   因為呼叫method方法的時候首先回去找父類中有沒有這個方法   結果父類中沒有這個方法  所以就會報錯

弊端的解決辦法

不能使用子類的特有功能。
我就想使用子類的特有功能?行不行?
    行。
怎麼用呢?
    A:建立子類物件呼叫方法即可。(可以,但是很多時候不合理。而且,太佔記憶體了)
    B:把父類的引用強制轉換為子類的引用。(向下轉型)

物件間的轉型問題:
    向上轉型:
        Fu f = new Zi();
    向下轉型:
        Zi z = (Zi)f; //要求該f必須是能夠轉換為Zi的。

程式碼解釋

class Fu {
public void show() {
    System.out.println("show fu");
}

}

class Zi extends Fu {
public void show() {
    System.out.println("show zi");
}

public void method() {
    System.out.println("method zi");
}

}

class DuoTaiDemo4 {
public static void main(String[] args) {
    //測試
    Fu f = new Zi();
    f.show();
    //f.method();

    //建立子類物件
    //Zi z = new Zi();
    //z.show();
    //z.method();這個是可以呼叫show和method方法的 但是又要為新的物件Zi開闢記憶體空間  這樣的做法顯然是不合理的  

    //你能夠把子的物件賦值給父親,那麼我能不能把父的引用賦值給子的引用呢?
    //如果可以,但是如下
    Zi z = (Zi)f;
    z.show();
    z.method();
}

}

多型繼承中的記憶體圖解

這裡寫圖片描述

多型中物件變化記憶體圖解

這裡寫圖片描述