例如,父類動物,亞綱貓,狗。其中,Animal可以是壹個類,也可以是壹個接口,Cat和Dog是繼承或實現Animal的子類。
animalanimal = newCat();
也就是說,聲明了父類,但它實際上指向了子類的壹個對象。
那這樣用有什麽好處,為什麽這樣用?可以用這幾個關鍵詞來概括:多態、動態鏈接、向上轉化。有人說這是面向接口編程,可以減少程序。
的耦合,即調用者不必關心調用的是哪個對象,只需要編程接口,被調用者對調用者完全透明。讓妳更關註父類能做什麽,還有
不管子類是怎麽做的,妳都可以隨時替換壹個子類,也就是說,妳可以隨時替換壹個特定的實現,而不用修改其他的。
未來將設計模式(如工廠模式、代理模式)與反射機制相結合,可能會有更深的理解。
下面介紹Java的多態性及其動態鏈接,並向上轉化:
面向對象的三個特征:封裝、繼承和多態;
封裝隱藏了類的內部實現機制,可以在不影響用戶的情況下修改類的內部結構,保護數據。
繼承就是重用父類的代碼,子類繼承父類,擁有父類的成員。
方法的重寫、重載和動態連接構成了多態。Java之所以引入多態的概念,原因之壹是它和C++在類的繼承上不同,c++允許多重繼承,這才真正賦予了它
它帶來了非常強大的功能,但是復雜的繼承關系也給C++開發者帶來了更多的麻煩。為了規避風險,Java只允許單壹繼承,派生類和基類之間有壹個IS-A關系。
(即“貓”是“動物”)。雖然這樣保證了繼承關系的簡單性,但是在功能上勢必有很大的局限性,所以Java引入了多態性的概念來彌補這壹點。
此外,抽象類和接口也是解決單壹繼承限制的重要手段。同時,多態性也是面向對象編程的本質。
要理解多態性,首先要知道“向上轉化”
我定義了壹個子類Cat,繼承了Animal類,所以後者是前者是父類。我可以通過
catc = newCat();
實例化壹個貓對象,不難理解。但是當我這樣定義的時候:
animala = newCat();
這是什麽意思?
很簡單,這意味著我定義了壹個動物類型的引用,指向新創建的貓類型的對象。因為Cat是從它的父類Animal繼承來的,Animal類型的引用可以指向。
Cat類型的對象。這就是“向上轉化”。