天天看點

領略多态的魅力-對象向上轉型 | 帶你學《Java面向對象程式設計》之四十八

上一篇:初識面向對象第三特征-多态 | 帶你學《Java面向對象程式設計》之四十七

【本節目标】

通過閱讀本節内容,你将了解到向上轉型在程式設計過程中帶來的便利性與面向對象程式設計的魅力,學會借助繼承與向上轉型實作某些複雜的業務邏輯。

對象向上轉型(接收或傳回參數的統一性)

對象轉型的處理屬于多态性,而這一特性必須在繼承性的基礎上實作。

範例:觀察一個簡單代碼

class Message {
    public void print() {
        System.out.println(“www.mldn.cn”) ;  
    }
}
Class DataBaseMessage extends Message {
    public void print() {
        System.out.println(“Oracle資料庫連接配接資訊…..”) ;
    }
}
public class JavaDemo{
    public static void main(String args[]) {
        DataBaseMessage msg = new DataBaseMessage() ;
        msg.print() ;
    }
}           

本程式是一個簡單的方法覆寫操作實作,整體的程式之中可以發現,由于現在執行個體化的是子類對象,并且子類對象覆寫了父類中的print()方法,是以調用的是被覆寫過的方法。

範例:觀察向上轉型

class Message {
    public void print() {
        System.out.println(“www.mldn.cn”) ;  
    }
}
Class DataBaseMessage extends Message {
    public void print() {
        System.out.println(“Oracle資料庫連接配接資訊…..”) ;   //執行結果: Oracle資料庫連接配接資訊…..
    }
}
public class JavaDemo{
    public static void main(String args[]) {
        Message msg = new DataBaseMessage() ;    //向上轉型
        msg.print() ;
    }
}           

那麼這個時候就需要思考了,向上轉型這種操作有什麼主要的用處呢?

class Message {
    public void print() {
        System.out.println(“www.mldn.cn”) ;  
    }
}
class DataBaseMessage extends Message {
    public void print() {
        System.out.println(“Oracle資料庫連接配接資訊…..”) ;   
    }
}
class WebServerMessage extends Message {
    public void print() {
        System.out.println(“WEB伺服器連接配接資訊…..”) ;   
    }
}
public class JavaDemo{
    public static void main(String args[]) {
       fun(new DataBaseMessage());  // Message msg = new DataBaseMessage()
       fun(new WebServerMessage()) ;     // Message msg = new WebServerMessage()
    }
    public static void fun(Message msg) {   //不管傳遞的是哪一個子類都可以接收
       msg.print() ;
    }
}           

執行結果:

Oracle資料庫連接配接資訊…..

WEB伺服器連接配接資訊…..

向上轉型的主要特點在于可以對參數進行統一的設計。但是為什麼此時不使用重載來解決目前問題?

public class JavaDemo{
    public static void main(String args[]) {
        fun(new DataBaseMessage());  // Message msg = new DataBaseMessage()
        fun(new WebServerMessage()) ;     // Message msg = new WebServerMessage()
    }
    public static void fun(DataBaseMessage msg) {   //不管傳遞的是哪一個子類都可以接收
        msg.print() ;
    }
    public static void fun(WebServerMessage msg) {   //不管傳遞的是哪一個子類都可以接收
        msg.print() ;
    }
}           

現在的操作利用了重載解決了目前的設計,的确可以實作與之前完全一樣的效果。但是在進行程式類設計的時候除了滿足于目前的要求之外,還需要做出可維護性的設計。如果說現在随着項目的發展,Message産生了3W個子類,那麼這個時候每當擴充一個Message子類之後就需要追加一個fun()的方法重載,這樣就對程式的維護性造成很大影響。

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:領略多态的魅力-對象向下轉型 | 帶你學《Java面向對象程式設計》之四十九 更多Java面向對象程式設計文章檢視此處