深刻理解多態(磨礪營馬劍威java)

【威哥說】王健林一句話,刷爆了朋友圈。「先定一個能達到的小目標,比方說我先掙它一個億」。好吧,也許咱們沒有那樣的霸氣,至少咱們能夠實現這樣「先定一個能達到的小目標,比方說學會多態」。 【正文】今天帶你們深刻理解面向對象的三大特徵之一多態。java

多態:同一事物的多種形態。

首先我們舉幾個例子來講明多態的概念。話說威哥兒子leo比較喜歡小動物,因此家裏養了小貓,小狗和烏龜。我們學了繼承關係,因此若是有分析的話須要四個類:

共同的父類:Pet(寵物)

abstract class Pet{微信

abstract void run();測試

}code

針對小狗咱們會有一個狗類,來繼承寵物類,並重寫run的方法:

class Dog extends Pet{對象

void run() {繼承

}接口

}class

此時咱們根據以前面向對象知識,若是說建立一個狗類的話寫法是:

Dog d = new Dog();變量

也就是聲明一個狗類型的變量,並經過構造方法完成初始化,如今咱們能夠說有一隻小狗叫作d;如今看着迎面跑來的這個小狗,威哥笑着對leo說:「leo,你的小寵物跑來了」。注意這裏的重點,你的小寵物跑過來了,你的小寵物,對,你沒看錯,是小寵物,那麼我們這個現實生活中的邏輯在代碼裏一樣是通的,具體表現爲:

Pet d = new Dog();擴展

也就是說,咱們有一隻狗,咱們也能夠叫作小寵物,專業叫法叫作:

父類引用指向子類對象

那有人說這個怎麼跟多態能扯上關係,簡單點理解就是一個對象,多種形態,左邊是一種寵物形態,右邊是一個狗形態,這不就是多態麼。

理解了多態的概念,那麼我們看看在程序中多態具體體如今那些方面:

一、對象的多態性:

咱們看看對象的多態性如何引伸出來。

如今咱們要調用的話就是,在測試類中直接定義run方法,傳入Dog類型的參數,而後在主方法中建立Dog對象,直接調用run方法,傳入dog,具體代碼以下:

public static void main(String[] args) {

Dog dog = new Dog();

run(dog);

}

public static void run(Dog dog){

dog.run();

}

如今我又多了一個豬類:

豬類:

class Pig extends Pet{

void run() {

}

}

此時豬受寵了,leo又想看豬蠢萌的跑法了,那麼此時又得定義

public static void main(String[] args) {

Dog dog = new Dog();

run(dog);

Pig pig = new Pig();

run(pig);

}

public static void run(Dog dog){

dog.run();

}

public static void run(Pig pig){

pig.run();

}

而後在main方法中建立Pig對象,而後調用run方法將pig對象傳入進去。

哎,此時我們帥氣的leo小男神看了龜兔賽跑,又想看烏龜跑了,那麼此時得建立一個烏龜類:

烏龜類:

class Tutle extends Pet{

void run() {

}

}

一樣的,須要調用的話,又得寫一個方法,傳入烏龜的參數類型,具體以下:

public static void main(String[] args) {

Dog dog = new Dog();

run(dog);

Pig pig = new Pig();

run(pig);

Tutle tutle = new Tutle();

run(tutle);

}

public static void run(Dog dog){

dog.run();

}

public static void run(Pig pig){

pig.run();

}

public static void run(Tutle tutle){

tutle.run();

}

此時咱們發現run方法是大量的重複,並且處理都是直接調用run方法,那麼我們以前也說了父類引用能指向子類對象,那麼我們就能夠直接來個升級版:

public static void run(Pet pet){

pet.run();

}

此時,無論你傳入狗仍是豬仍是烏龜,均可以直接調用抽取出來的run方法,由於咱們說了不管是狗,烏龜,仍是豬都屬於寵物類型,均可以直接

public static void main(String[] args) {

Dog dog = new Dog();

run(dog);

Pig pig = new Pig();

run(pig);

Tutle tutle = new Tutle();

run(tutle);

}

此時結構就很明朗了,那麼此時咱們顯而易見的是咱們能夠總結出擴展的好處了:

a) 提高了代碼的複用性;

而且,咱們還有一點就是,若是後邊leo又準備買一隻兔子,那麼咱們能夠直接使用run方法,建立兔子對象傳入便可,因此,此處還有第二個好處:

b) 提升了代碼的擴展性,前面定義的結構利於後邊使用。

固然,針對接口也是同樣的,上面的父類指父類結構,包括父類和父類接口。

二、方法的多態性

方法的多態性包括方法的重載,方法的重寫等。一樣也是一個事物多種形態的體現。

此處咱們簡單跟你們總結一下重載和重寫的概念:

重載:同一類中,方法名相同,參數列表不一樣,返回值類型不能做爲重載的判斷條件

重寫:子父類中,方法名相同,參數列表相同,返回值相同,子類重寫的權限要不小於父類方法的權限,子類中拋出的異常不能大於父類中拋出的異常。

更多內容關注微信公衆號mjw-java或訪問www.moliying.com

相關文章
相關標籤/搜索