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