Java多型的理解

2021-07-25 09:54:27 字數 1686 閱讀 2223

要想清楚的理解什麼是多型,就必須要了解「向上轉型」這個概念。 下面我們通過乙個例子來介紹向上轉型。

public class person 

protected void sleep()

public void play() }

public class student extends person }

public class main

}

上面**中定義了兩個類:person類和student類。student類繼承自person類。 

person類中有三個方法:私有方法eat(), 保護方法sleep(),公有方法play()。

因為student類繼承自person類,則person類中的protected方法和public方法可以被繼承下來。所以student類擁有三個方法:sleep(),play(), study()。這三個方法可以被student類物件呼叫。

person p = s;    該行**即實現了所謂的「向上轉型」操作。 所謂「向上轉型」,即:將子類物件的引用轉換為父類的引用。

該行**中,s為子類student類的引用,p為父類person類的引用。

那麼進行向上轉型操作後,會有什麼效果呢,也就是說我們要弄清父類引用p可以呼叫哪些方法。

既然向上轉型為父類引用,則p只可以呼叫父類的方法,而且只能是父類中可以被子類繼承的方法(這樣說不太嚴謹,暫且先不考慮方法的重寫)。換句話說,子類的新方法都會被遺棄。向上轉型之後,父類引用所能呼叫的方法,相對子類物件引用所能呼叫的方法來說,會變窄。

明白了上述「向上轉型」之後,我們接下來,再看下面的**:

public class person 

protected void sleep()

public void play() }

public class student extends person

public void play() }

public class worker extends person

public void play() }

public class main

}

上述**的變化之處在於:父類中有play()方法,而其兩個子類中也都分別有play()方法。則子類中的方法將會覆蓋父類中的方法。也就是說,當我們寫如下**時:

student s = new student();

s.play();

**將會輸出:student is playing。 由此可知子類覆蓋了父類的方法。

而對於上述main方法中的**來說,我分別例項化了兩個子類物件,並將其向上轉型為父類引用,當我們執行上述程式之後,我們發現父類引用分別呼叫了對應的子類中的方法。such a suprise! 對於這種機制,我們稱之為「多型」。

總的來說,多型的實現有三個條件:繼承,方法重寫,父類引用指向子類物件。

串起來來說就是:子類繼承父類,並且子類重寫了父類中的方法,我們例項化乙個子類物件,並用父類的引用去指向它。父類引用呼叫重寫方法時,會在執行時正確呼叫對應子類中的方法。

或者說:當我們進行向上轉型之後,我們擁有父類的引用,而這個父類的引用只能夠呼叫父類中可以被子類繼承的方法。而如果正好父類中的這個方法在子類中進行了重寫,那麼父類引用在呼叫這個方法時,將會呼叫的是子類中的方法,不再是父類中的方法,這便是多型。

Java 多型的理解

物件導向程式設計有三個特徵,即封裝 繼承和多型。封裝隱藏了類的內部實現機制,從而可以在不影響使用者的前提下改變類的內部結構,同時保護了資料。繼承是為了重用父類 同時為實現多型性作準備。那麼什麼是多型呢?要理解多型性,首先要知道什麼是 向上轉型 我定義了乙個子類cat,它繼承了animal類,那麼後者...

java多型的理解

public string show d obj public string show a obj class b extends a public string show b obj public string show a obj class c extends b class d extend...

java多型的理解

class a public void show a obj class b extends a public void show a obj class c extends b class d extends b a a1 new a a a2 new b b b new b c c new c ...