面向對象的程序設計有三大特征:封裝、繼承、多態。
封裝性有兩重含義,一是指把對象的屬性和行為看成一個密不可分的整體,將這兩者“封裝”到一個不可分割的對象中;二是指對信息的隱蔽,盡可能隱蔽對象的功能實現細節。 封裝機制的另一個特點就是為封裝在一個整體內的變量及方法規定不同等級的“可見性”或訪問權限。
封裝的好處: 1)良好的封裝能夠減少耦合 2)類內部的結構可以自由修改。 3)可以對成員進行更精確的控制。 4)隱藏信息,實現細節。
繼承是為了重用父類代碼。兩個類若存在is-a 的關系就可以使用繼承. 復用代碼是 java 眾多引人注目的功能之一,注意,這里是“復用代碼”而非“復制代碼”。
1、子類擁有父類非 PRivate 的屬性和方法。(但繼承不了構造器,只能通過super()調用構造器) 2、子類可以擁有自己屬性和方法,即子類可以對父類進行擴展。 3、子類可以用自己的方式實現父類的方法。(以后介紹)。
繼承的好處: 1)增強了代碼的可復用性 2)提高了軟件開發的效率 3)降低了程序產生錯誤的可能性 4)為程序的修改提供了便利
繼承的缺陷: 1)父類變,子類就必須變。 2)繼承破壞了封裝,對于父類而言,它的實現細節對與子類來說都是透明的。 3)繼承是一種強耦合關系。 注:java語言不支持多繼承,但可以通過接口(interface)的方式來彌補由于java不支持多繼承而帶來的子類不能享用多個父類的成員的缺點。
多態是以封裝和繼承為基礎,在抽象的層面上實施一個統一的行為,相同的事物,調用其相同的方法,參數也相同時,但表現的行為卻不同。
Java 實現多態有三個必要條件: 1)存在繼承關系 2)子類重寫父類的方法。子類重寫了父類的方法,調用父類的方法,實際調用的是子類重寫了的父類的該方法。即Father f = new Children(),f.toString()實際上調用的是Children中的toString()方法。 3)父類引用指向子類對象
多態的分類: 1)編譯時多態,即方法的重載,從JVM的角度來講,這是一種靜態分派(static dispatch) 2)運行時多態,即方法的重寫,從JVM的角度來講,這是一種動態分派(dynamic dispatch)
多態的原則: 比如我們有一個父類Father,有一個子類Children 1、向上轉型是自動的。即Father f = new Children()是自動的,不需要強轉 2、向下轉型要強轉。即Children c = new Father()是無法編譯通過的,必須要Children c = (Children)new Father(),讓父類知道它要轉成具體哪個子類。
一個多態的經典實例:多態示例
新聞熱點
疑難解答