多態

封裝通過合併特徵和行爲來創建新的數據類型,“實現隱藏”通過將細節“私有化”把接口和實現分離出來。多態通過分離“做什麼”和“怎麼做”將接口與實現分離出來。

多態方法的實現

第一個條件

我們知道類的繼承,導出類可以覆蓋基類的方法。

第二個條件

Java支持向上轉型和動態綁定,所謂動態綁定就是Java程序在運行的時候能夠自動地判斷對象的類型,從而根據對象的類型而調用正確地方法(此方法必須是導出類覆蓋的方法,而不是導出類的擴展方法) 。

所以

所以Java程序由於向上轉型和動態綁定只需要操作基類對象就可以對每一個不同的導出類而實現相應的方法。

注意:Java中static方法和final方法(private方法屬於final方法)不支持後期綁定。因爲static和final方法均不能被覆蓋。

class Shape{
     void draw();
}
class Circle extends Shape{
     void draw(){
         System.out.println("Draw a Circle");
    }
}
class Triangle extends Shape{
     void draw(){
         System.out.println("Draw a Triangle");
    }
}
public class Shapes{
    public static void main(String[] args){
        Shape[] x = {
            new Circle();
            new Triangle();
        }
        x[0].draw();
        x[1].draw();
    }
}
/*控制檯輸出
Draw a Circle
Draw a Triangle
*/

抽象類和抽象方法

多態方法的實現是建立在導出類繼承時覆蓋基類的方法之上的。而在Java中可以通過關鍵字abstract來將一個方法聲明成抽象方法(含有抽象方法的類是抽象類,無法創建實例),抽象方法僅有聲明而無具體的實現代碼。

構造器內部與多態方法

編寫構造器的一條準則是:“用儘可能簡單的方法使對象進入正常狀態;如果可以的話,避免調用其他方法”。如果在構造器內調用某個方法,可能操作那個方法的對象還未被初始化,從而招致災難!!!

在構造器內唯一能夠安全調用的方法是基類中的final方法(也適用於private方法,因爲它自動屬於final方法),這些方法不會被覆蓋,因此也就不會出現令人驚訝的問題。

向下轉型

Java中所有的轉型都會得到檢查,以確保它是我們希望的那種類型,如果不是就會throw一個ClassCastException。這種在運行期間對類型進行檢查的行爲稱作“運行時類型識別”(RTTI)。

class Shape{
     void f();
}
class Circle extends Shape{
     void f();
     void u();
}
public class Shapes{
    public static void main(String[] args){
        Shape[] x = {
            new Shape();
            new Circle();
        }
        x[0].f();
        x[1].f();
        //! x[1].u();
        ((Circle)x[1]).u();   //DownCast/RTTI
        ((Circle)x[0]).u();   //Exception throw
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章