繼承、封裝、多態(tài)
多態(tài)(polymorphism)多態(tài)是OOP中的一個重要特性,主要用于實現(xiàn)動態(tài)綁定。換句話說,程序的最終狀態(tài)只在執(zhí)行過程中確定,而不是在編譯過程中。這可以提高系統(tǒng)對于大規(guī)模系統(tǒng)的靈活性和可擴展性。
多態(tài)允許我們使用一個對象的一些方法,而不關(guān)注它的具體類型,從而實現(xiàn)更靈活的編程,提高系統(tǒng)的可擴展性。
為什么需要多態(tài)?
多態(tài)性是指允許不同種類的對象對同一條消息做出不同的響應。
如何在java中實現(xiàn)多態(tài)性?使用多態(tài)有什么好處?
有兩種類型的參考變量:
編譯時類型(模糊地說,通常是父類)
由申報時的類型決定。
運行時類型(運行時,哪個子類是哪個子類)
是由實際對應的對象類型決定的。通過動態(tài)綁定調(diào)用此對象的方法。動態(tài)綁定會讓我們的編程更加靈活,但是會降低程序的運行速度。這也是JAVA比C++/C慢的主要原因之一。
多態(tài)性:如果編譯時類型與運行時類型不一致,就會造成多態(tài)性。
方法綁定(方法綁定)
在執(zhí)行調(diào)用方法時,系統(tǒng)可以根據(jù)相關(guān)信息在內(nèi)存地址中執(zhí)行代表該方法的代碼。分為靜態(tài)綁定和動態(tài)綁定。
靜態(tài)綁定:
編譯時完成可以提高代碼執(zhí)行速度。
動態(tài)綁定:
對象調(diào)用的方法采用動態(tài)綁定機制。雖然這使我們在編程上很靈活,但它降低了代碼執(zhí)行的速度。這是JAVA比C/C++慢的主要原因之一。在JAVA中,除了final類、final party和static方法之外的所有方法都是在運行時由JVM動態(tài)綁定的。
應該為成員變量和靜態(tài)方法提供關(guān)于動態(tài)綁定的特殊課程:
http://blog.sina.com.cn/s/blog_600046120100wdza.html
http://blog.csdn.net/aaaaaaaa0705/article/details/6263213
http://www.doc88.com/p-389664843916.html
使用多態(tài)性的要點
1.多態(tài)是方法的多態(tài),屬性沒有多態(tài)。
2.編寫程序時,如果要調(diào)用運行時類型的方法,只能轉(zhuǎn)換類型。否則,它將無法通過編譯器的檢查。但是,如果強制轉(zhuǎn)換兩個不相關(guān)的類,將會報告ClassCastException。比如,它本來是一只狗,但是我把它變成了一只貓。會報告這個異常。
3.多態(tài)性的存在有三個必要條件:繼承、方法重寫和指向子類對象的父類引用
對象轉(zhuǎn)換(鑄造)
為什么我需要鑄造一個類型?
引用變量只能調(diào)用其編譯類型的方法,而不能調(diào)用其運行類型的方法。這時候就需要鑄型了!
一個父類的引用類型變量可以“指向”其子類的對象。一個父類的引用不可以訪問其子類對象新增加的成員(屬性和方法)??梢允褂?引用 變量 instanceof 類名 來判斷該引用型變量所“指向”的對象是否屬于該類或該類的子類。子類的對象可以當作基類的對象來使用稱作向上轉(zhuǎn)型(upcasting),反之稱為向下轉(zhuǎn)型(downcasting)課堂代碼package cn.bjsxt.oop .多態(tài);
公共級動物{
String str
public void voice(){
System.out.println("普通動物的叫聲!");
}
}
貓類延伸動物{
public void voice(){
System.out.println("喵喵");
}
public void CaptMouse(){
System.out.println("抓老鼠");
}
}
狗類延伸動物{
public void voice(){
system . out . println(" Wang Wang ");
}
public void seeDoor(){
System.out.println("看門人!");
}
}
虎類延伸動物{
public void voice(){
System.out.println("哇哇");
}
}
豬類延伸動物{
public void voice(){
system . out . println(" hem ");
}
}
package cn.bjsxt.oop .多態(tài);
公共類測試{
公共靜態(tài)無效測試動物聲音(動物c){
c . voice();
if(Cat的c實例){
((Cat) c)。catch Mouse();
}
}
/*
public static void testAnimalVoice(Dog c){
c . voice();
}
public static void testAnimalVoice(Pig c){
c . voice();
}*/
//賈維克·Test.java
// java測試
公共靜態(tài)void main(String[] args) {
動物a =新貓();
Cat a2 =(Cat)a;
testAnimalVoice(a);
//a2 . catch Mouse();
//動物b =新狗();
//Animal c = new Tiger();
//testAnimalVoice(b);
//testAnimalVoice(c);
}
}
1.《面向?qū)ο蠓椒?面向?qū)ο蟆鄳B(tài)》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《面向?qū)ο蠓椒?面向?qū)ο蟆鄳B(tài)》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/guonei/788435.html