75.多態概述

在Java中,對象變量是多態的。一個類型爲Aclass的變量既可以指向類型爲Aclass的對象,又可以指向Aclass的任何子類的對象。


以多態的形式來傳遞參數,增強了參數類型的靈活性。


現在假設有一個類Aclass,由它派生了一個子類Bclass,那麼,我們可以將子類Bclass的對象賦給父類變量:
Aclass a = new Bclass();


這其實體現了Java中的所謂“替換原則(substitution principle)”:無論何時,只要程序需要一個父類對象,那麼就可以用一個子類對象來替代它。


多態帶來的一個明顯的好處就是:以多態的形式來傳遞參數,增強了參數類型的靈活性


例如,我們需要在學校管理系統的某個類(假設爲CalClass)中定義一個方法來根據學生或老師的年齡來計算相應的出生年代(此處“Teacher”類和“Stucent”類均爲“Person”類的子類),可以這樣來定義這個方法:
public class CalClass{
 … …
 public int calTeacherBirthYear(Teacher t){
  // 根據參數t的年齡來計算教師的出生年代
 }
 public int calStudentBirthYear(Student s){
  // 根據參數s的年齡來計算學生的出生年代
 }
}
如果使用多態的概念,我們只要定義一個方法來計算就可以了:
public class CalClass{
 .. …
 public int calPersonBirthYear(Person p) {
  // 根據參數p的年齡來計算出生年代
 }
}


如果需要計算某個學生的出生年代,只需要將這個學生對應的對象當作參數傳遞給這個方法,如果需要計算某個老師的出生年代,只需要將這個老師對應的對象當作參數傳遞給這個方法。


在使用多態來傳遞參數的時候,有一個問題需要注意:一個對象只能有一種確切的數據類型,如果將一個變量聲明爲父類的引用類型,那麼,即使它引用的對象是某個子類的對象,編譯器也只是將這個對象當作是父類型對象,因此,若一個引用類型變量如果聲明爲父類的類型,但實際引用的是子類對象,那麼該變量就不能再訪問子類中添加的屬性和方法。


比如,我們用Person來聲明一個變量,然後再將這個變量指向Teacher,這個時候,就不能用這個變量來調用子類Teacher特有的方法或屬性了:
 Person p;
 p = new Teacher();
 p.setDepartment(“數學教研室”);//錯誤


除了父類和子類之間的這種多態機制外,接口和實現它的類之間也可以象父類和子類一樣實現多態機制,只需要簡單的將接口看成實現它的類的“父類”即可

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