Java 多型的理解

2021-05-28 02:52:20 字數 1992 閱讀 6358

物件導向程式設計有三個特徵,即封裝、繼承和多型。

封裝隱藏了類的內部實現機制,從而可以在不影響使用者的前提下改變類的內部結構,同時保護了資料。

繼承是為了重用父類**,同時為實現多型性作準備。那麼什麼是多型呢?

要理解多型性,首先要知道什麼是「向上轉型」。

我定義了乙個子類cat,它繼承了animal類,那麼後者就是前者是父類。我可以通過

cat c = new cat();

例項化乙個cat的物件,這個不難理解。但當我這樣定義時:

animal a = new cat();

這代表什麼意思呢?

很簡單,它表示我定義了乙個animal型別的引用,指向新建的cat型別的物件

。由於cat是繼承自它的父類animal,所以animal型別的引用是可以指向cat型別的物件的。那麼這樣做有什麼意義呢?因為子類是對父類的乙個改進和擴充,所以一般子類在功能上較父類更強大,屬性較父類更獨特,

定義乙個父類型別的引用指向乙個子類的物件既可以使用子類強大的功能,又可以抽取父類的共性。

所以,父類型別的引用可以呼叫父類中定義的所有屬性和方法,而對於子類中定義而父類中沒有的方法,它是不能呼叫的;(但是如果強制把超類轉換成子類的話,就可以呼叫子類中新新增而超類沒有的方法了。)

同時,父類中的乙個方法只有在在父類中定義而在子類中沒有重寫的情況下,才可以被父類型別的引用呼叫;

換個說法 : 如果子類重寫了父類的定義的方法,父類型別的引用呼叫的則是子類的方法 這就是動態連線。

例子

class father 

void fun2()

}class child extends father

void fun2()

}public class main

public string show(a obj)

}class b extends a

public string show(a obj)

public string show()

}class c extends b

class d extends b

public class main

}

結果如下

分析:部分摘自

方法呼叫的優先問題 ,優先順序由高到低依次為:this.show(o)、super.show(o)、this.show((super)o)、super.show((super)o)。讓我們來看看它是怎麼工作的。

a1 是 a 的乙個物件引用,呼叫 類 a 的show() 會根據傳入的引數 ,函式會發生過載。若傳入 d的例項,則會顯示 「 a and d」 .若傳入 a 的例項,或者 a 的子類的

例項,則會輸出 「a and a 」.

a2 是 a 的乙個引用,卻指向乙個 b 的物件(b 是 a 的子類)。a2 呼叫 show()時,先會看父類中有無該函式,該函式如果沒有被子類重寫,則執行父類的函式,否則執行子類的函式。

a2.show(b)   ,類 a 中存在該函式 show(a a),但是 在子類 b 中被重寫了,故 執行 類b 的 show(a   a)。輸出  b and a. 下面以方法呼叫順序說明

a2 對應 this 應該為 a, o 對應b. (super)o 就是對應 a.

a2.show(b)  類 a 中 沒有show(b b),====》類a沒有super*****==>a.show((super)o)  即 a.show(a a)  但是發現類b 重寫了該方法,故執行 b.show(a a).

a2.show(c)

a2 對應 this 應該為 a, o 對應c. (super)o 就是對應 b.

a2.show(c)  類 a 中 沒有show(c c),====》類a沒有super*****==>a.show((super)o)  即 a.show(b b)  剛剛我們知道 a.show(b b)顯示   b and a.

Java多型的理解

要想清楚的理解什麼是多型,就必須要了解 向上轉型 這個概念。下面我們通過乙個例子來介紹向上轉型。public class person protected void sleep public void play public class student extends person public c...

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 ...