Java:多態(向上轉型)


先來看一段代碼:

class BaseClass{
    
     public  int book = 6;
    
     public  void base(){
        System.out.println("父類的普通方法");
    }
    
     public  void test(){
        System.out.println("父類被覆蓋的方法");
    }
}

public  class SubClass  extends BaseClass{
    
     // 重新定義一個book實例成員變量隱藏父類的book實例成員變量
     public String book = "輕量級Java EE企業應用實戰";
            
     public  void test(){
        System.out.println("子類的覆蓋父類的方法");
        
    }
     public  void sub(){
        System.out.println("子類的普通方法");
        
    }
     public  static  void main(String[] args) {
        
         // 下面編譯時類型和運行時類型完全一樣,因此不存在多態
        BaseClass bc =  new BaseClass();
         // 輸出6
        System.out.println(bc.book);
         // 下面兩次調用將執行BaseClass的方法
        bc.base();
        bc.test();
        
         // 下面編譯時類型和運行時類型完全一樣,因此不存在多態
        SubClass sc =  new SubClass();
         // 輸出"輕量級Java EE企業應用實戰"
        System.out.println(sc.book);
         // 下面調用將執行從父類繼承到的base方法
        sc.base();
         // 下面調用將執行當前類的test方法
        sc.test();
        
         // 下面編譯時類型和運行時類型不一樣,多態發生
        BaseClass ploymophicBc =  new SubClass();
         // 輸出6 -----  表明訪問的是父類的成員變量
        System.out.println(ploymophicBc.book);
         // 下面調用將執行父類繼承到的base方法
        ploymophicBc.base();
         // 下面調用將執行當前類的test方法
        ploymophicBc.test();
    }

說明:

   當把一個子類對象直接賦給父類的引用變量是,例如上面的BaseClass ploymophicBc = new SubClass();,這個ploymophicBC應用變量的編譯時類型是BaseClass,而運行時類型是SubClass,當運行時調用該引用變量的方法,其行為總是表現出子類方法的行為特征,而不是父類方法的行為特征,這就可能出現:相同類型的變量,調用同一個方法時呈現出多種不同的行為特征,這就是多態。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM