談談多型

五月的倉頡發表於2015-09-18

概述

我們都知道物件導向有四個基本特性:抽象、封裝、繼承、多型。這四個特性,概括起來可以這麼理解,抽象、封裝、繼承是多型的基礎,多型是抽象、封裝、繼承的表現。多型,是Java中非常重要的一個部分,所以今天來談一下多型(Polymorphism)。

 

什麼是多型

不同類的物件對同一訊息作出不同的響應就叫做多型。就像上課鈴響了,上體育課的學生跑到操場上站好,上語文課的學生在教室裡坐好一樣。

 

多型的作用

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

 

多型存在的三個條件

1、有繼承關係  

2、子類重寫父類方法  

3、父類引用指向子類物件

補充一下第二點,既然多型存在必須要有“子類重寫父類方法”這一條件,那麼以下三種型別的方法是沒有辦法表現出多型特性的(因為不能被重寫):

1、static方法,因為被static修飾的方法是屬於類的,而不是屬於例項的

2、final方法,因為被final修飾的方法無法被子類重寫

3、private方法和protected方法,前者是因為被private修飾的方法對子類不可見,後者是因為儘管被protected修飾的方法可以被子類見到,也可以被子類重寫,但是它是無法被外部所引用的,一個不能被外部引用的方法,怎麼能談多型呢

 

多型的分類

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

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

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

 

分析多型問題的幾條原則

如果不去理解多型的原理,就從使用的角度來講,以個人的學習、工作這幾年的經驗,總結出了多型無非就是三句話:

比如我們有一個父類Father,有一個子類Children

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

2、向下轉型要強轉。即Children c = new Father()是無法編譯通過的,必須要Father f = new Children();Children c = (Children)f,讓父類知道它要轉成具體哪個子類

3、父類引用指向子類物件,子類重寫了父類的方法,呼叫父類的方法,實際呼叫的是子類重寫了的父類的該方法。即Father f = new Children(),f.toString()實際上呼叫的是Children中的toString()方法

 

後記

多型是Java語言體系中最基礎、最重要的概念,工作中哪裡都有用到,必須好好地將它理解透了。另外,本篇文章是本人部落格園發的第一篇文章,希望以後寫出更多更好、更有質量的文章。f

相關文章