談談多態

概述設計模式

咱們都知道面向對象有四個基本特性:抽象、封裝、繼承、多態。這四個特性,歸納起來能夠這麼理解,抽象、封裝、繼承是多態的基礎,多態是抽象、封裝、繼承的表現。多態,是Java中很是重要的一個部分,因此今天來談一下多態(Polymorphism)。學習

 

什麼是多態spa

不一樣類的對象對同一消息做出不一樣的響應就叫作多態。就像上課鈴響了,上體育課的學生跑到操場上站好,上語文課的學生在教室裏坐好同樣。設計

 

多態的做用對象

簡單講就是解耦。再詳細點講就是,多態是設計模式的基礎,不能說全部的設計模式都使用到了多態,可是23種中的很大一部分,都是基於多態的。繼承

 

多態存在的三個條件編譯器

一、有繼承關係  編譯

二、子類重寫父類方法  基礎

三、父類引用指向子類對象原理

補充一下第二點,既然多態存在必需要有「子類重寫父類方法」這一條件,那麼如下三種類型的方法是沒有辦法表現出多態特性的(由於不能被重寫):

一、static方法,由於被static修飾的方法是屬於類的,而不是屬於實例的

二、final方法,由於被final修飾的方法沒法被子類重寫

三、private方法和protected方法,前者是由於被private修飾的方法對子類不可見,後者是由於儘管被protected修飾的方法能夠被子類見到,也能夠被子類重寫,可是它是沒法被外部所引用的,一個不能被外部引用的方法,怎麼能談多態呢

 

多態的分類

一、編譯時多態,即方法的重載,從JVM的角度來說,這是一種靜態分派(static dispatch)

二、運行時多態,即方法的重寫,從JVM的角度來說,這是一種動態分派(dynamic dispatch)

關於這一點,在寫到JVM的時候會詳細講到

/*

看到這裏我不知道博主JVM角度是否說的正確,可是從編譯階段(編譯器角度來講是正確的)

*/

分析多態問題的幾條原則

若是不去理解多態的原理,就從使用的角度來說,以我的的學習、工做這幾年的經驗,總結出了多態無非就是三句話:

好比咱們有一個父類Father,有一個子類Children

一、向上轉型是自動的。即Father f = new Children()是自動的,不須要強轉

二、向下轉型要強轉。即Children c = new Father()是沒法編譯經過的,必需要Children c = (Children)new Father(),讓父類知道它要轉成具體哪一個子類

/*

這裏的向下轉型說的很好。讓父類知道它該轉換成哪一個子類。(孔子他爹和孔子,可是孔子他爹有好幾個兒子,兒子個個能假裝成他爹,他爹假裝他們時要知道去假裝成誰)

*/

三、父類引用指向子類對象,子類重寫了父類的方法,調用父類的方法,實際調用的是子類重寫了的父類的該方法。即Father f = new Children(),f.toString()實際上調用的是Children中的toString()方法

相關文章
相關標籤/搜索