天天看點

java基礎---->多态性

多态性 

在面向對象中多态性實際上是面向對象裡的一個最大的最有用的特點,對于多态性在java中有兩種展現:

   1、  方法的重載及覆寫

   2、  對象多态性:指的是父類對象和子類對象之間的轉型操作

一、對象多态性:

繼承允許将對象視為它本身或者它的父類的類型來處理,即将繼承自同一父類的基類可以視為同一類處理,一份代碼就可以毫無差别的運作在這些不同類型上。多态方法調用允許一種類型表現出與其他相似類型之間的差別,隻要它們是從同一基類導出的。雖然這些方法都通過基類調用。

實作原理:後期綁定:在運作時根據對象的類型進行綁定。後期綁定也稱為多态綁定或者運作時綁定。

Java中除了static方法和final方法(private方法屬于final方法),其他的方法都是後期綁定。

隻有普通的方法調用時多态的。

對象多态性的例子

基類,形狀類 Shape.java

子類1,圓形 Circle.java

子類2,三角形 Triangle.java

子類3,正方形 Square.java

多态性展現

二、多态性了解:

“覆寫”私有方法:

例子2:覆寫私有方法的現象,編譯器不報錯,但是不會按照我們期望的執行。

隻有普通方法的調用時多态的,如果通路某一個成員變量,該成員變量是public的,且父類子類都有這個屬性,它的通路是在編譯期進行解析。

雖然發生向上轉型,Super sup = new Sub();sup.field就沒有多态性,通路的是父類的field。

如果某一個方法是靜态的,它的行為就不具有多态性。

三、構造器内部調用的方法被子類覆寫的情況

構造器内部調用的方法被子類覆寫了。這個調用的效果很難預料,因為被覆寫的方法在對象被完全構造之前就會調用。這一定會造成一些難以發現的錯誤。

輸出結果顯示當Glyph的構造器調用draw()方法時候,radius不是預設初始值1而是0。

仔細分析這段代碼,可以發現

1.在其他任何事物發生之前,将配置設定給對象的存儲空間初始化成二進制的零。

2.如前所述那樣調用基類構造器,此時,調用被覆寫後的draw()方法(注意,要在調用RoundGlyph構造器之前調用),由于步驟1的緣故,我們此時會發現radius的值為0

3.按照聲明的順序調用成員的初始化方法。

4調用導出類的構造器主體

這樣有一個優點,至少保證所有的東西初始化為零或者null,而不僅僅是垃圾。其中通過‘組合’而嵌入到一個類内部的對象引用,其值是null,如果忘記為該值進行初始化,均會在運作時候出現異常。檢視結果時候,發現其他所有的東西都是0.

結論:編寫構造器的準則

用盡可能簡單的方法使對象進入正常狀态,可以的話,避免調用其他的方法。構造器内唯一能夠安全調用的方法是基類中的final方法(也适用于private,它們自動屬于final方法),這些方法不能被覆寫,是以也不會出現上述令人驚訝的問題。

四、向上轉型

發生向上轉型後,子類中自己的定義的操作是無法通過父類對象找到的。