java中多型的理解——父類引用指向子類物件

jerrysun發表於2021-09-09

java多型,如何理解父類引用指向子類物件

要理解多型性,首先要知道什麼是“向上轉型”。

我定義了一個子類Cat,它繼承了Animal類,那麼後者就是前者是父類。

我可以透過 Cat c = new Cat(); 例項化一個Cat的物件,這個不難理解。 但當我這樣定義時: Animal a = new Cat(); 表示定義了一個Animal型別的引用,指向新建的Cat型別的物件。由於Cat是繼承自它的父類Animal,所以Animal型別的引用是可以指向Cat型別的物件的。

那麼這樣做有什麼意義呢?因為子類是對父類的一個改進和擴充,所以一般子類在功能上較父類更強大,屬性較父類更獨特, 定義一個父類型別的引用指向一個子類的物件既可以使用子類強大的功能,又可以抽取父類的共性。

所以,父類型別的引用可以呼叫父類中定義的所有屬性和方法,而對於子類中定義而父類中沒有的方法,它是無可奈何的; 同時,父類中的一個方法只有在父類中定義而在子類中沒有重寫的情況下,才可以被父類型別的引用呼叫; 對於父類中定義的方法,如果子類中重寫了該方法,那麼父類型別的引用將會呼叫子類中的這個方法,這就是動態連線。也可以叫做動態繫結。

動態繫結是指”在執行期間(而非編譯期間)“判斷所引用物件的實際型別,根據實際的型別呼叫其相應的方法。

    class Father{   
Public void func1(){  
    Func2();  
}  
Public void fun2(){  
    System.out.println("AAA");  
    }  
}  

Class Child extends Father{  
       //func1(int i)是對父類func1()方法的一個過載,主要不是重寫! 
Public void func1(int i){  
    System.out.println("BBB");  
    }  
          //func2()重寫了父類Father中的func2()方法     
        //如果父類型別的引用中呼叫了func2()方法,那麼必然是子類中重寫的這個方法  
 Public void func2(){  
    System.out.println("CCC");  
    }  
}  

Public class Test{  
Public static void mian(String [ ]args){  
    Father child= new Child();  
    child.func1();//列印結果將會是什麼?  
    child.func1(89);//?該方法會怎樣呢?  
}  
  }  

上面的程式是個很典型的多型的例子。子類Child繼承了父類Father,並過載了父類的func1()方法,重寫了父類的func2()方法。過載後的func1(inti)和func1()不再是同一個方法,由於父類中沒有func1(int i),那麼,父類型別的引用child就不能呼叫func1(inti)方法。而子類重寫了func2()方法,那麼父類型別的引用child在呼叫該方法時將會呼叫子類中重寫的func2()。
那麼該程式將會列印出什麼樣的結果呢?很顯然,應該是“CCC”。

其實是多型的應用,體現在以下幾點:
使用父類型別的引用指向子類的物件
該引用只能呼叫父類中定義的方法和變數
如果子類中重寫了父類中的一個方法,那麼在呼叫這個方法的時候,將會呼叫子類中的這個方法;(動態連線、動態呼叫)
變數不能被重寫(覆蓋),”重寫“的概念只針對方法,如果在子類中”重寫“了父類中的變數,那麼在編譯時會報錯。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/151/viewspace-2808206/,如需轉載,請註明出處,否則將追究法律責任。

相關文章