Java:多态性
Java的多態性:發送消息給某個對象,讓該對象自行決定響應何種行為。 通過將子類對象引用賦值給超類對象引用變量來實現動態方法調用。
java的多態性要滿足三個條件:
1、繼承關系
2、在子類重寫父類的方法
3、父類引用指向子類的對象,即animal p = new dog()
在多態中非靜態成員函數的特點:
在編譯時期:參閱引用形變量所屬的類中是否有要調用的方法。如果有,編譯通過;否則,編譯不通過
在運行時期:參閱對象所屬的類中是否有要調用的方法。如果有,運行成功;否則,運行失敗。
總結:編譯時期看做左邊,運行時期看右邊。
在多太中成員變量和靜態成員函數的特點:
無論編譯和運行都參考左邊(引用類型變量所屬的類)
?
例子1:創建父類動物類Animal、子類貓類Cat、子類狗類Dog
//創建父類animal動物類 abstract class Animal {public abstract void eat(); } //創建動物類子類:貓類 class Cat extends Animal {public void eat(){System.out.println("吃魚");} } //創建動物類子類:狗類 class Dog extends Animal {public void eat(){System.out.println("吃骨頭");} }//多態的表現形式 class DuoTaiDemo {public static void main(String[] args) {Animal a = new Cat(); //父類的引用指向子類對象a.eat(); //父類中有eat()方法,編譯通過,子類中也有eat()方法,所以最終編譯成功 function(new Cat());function(new Dog());}//將動物類的引用當做參數傳遞給方法public static void function(Animal a){//判斷如果是Dogif(a instanceof Dog ){a.eat(); //調用父類的eat()方法Dog b = (Dog) a; //調用Dog的eat()方法 b.eat();}//如果是Catelse if(a instanceof Cat){a.eat();//調用父類的eat()方法Cat b = (Cat) a;//調用Cat的eat()方法 b.eat();}} }例子2:多態的功能擴展
? 基于電腦的實例(電腦主板)
? 擴展(網卡、聲卡、、、)
interface PCI //擴展功能的接口(規則) {public abstract void open();public abstract void close(); }class MainBoard //主板類 {public void run(){System.out.println("Mi anBoard run");}public void usePCI(PCI p) //PCI p = new NetCard() //接口型的引用指向自己的子類對象 {p.open();p.close();} }class NetCard implements PCI // 實現網卡的連接 {public void open(){ System.out.println("NetCard open");}public void close(){System.out.println("NetCard close");} }class SoundCard implements PCI // 實現聲卡的連接 {public void open(){ System.out.println("soundcard open");}public void close(){System.out.println("soundcard close");} }//主函數測試 class DuoTaiDemo1 {public static void main(String[] args){MainBoard mb = new MainBoard();mb.run();mb.usePCI(new NetCard()); mb.usePCI(new SoundCard());} }例子3:多態的擴展實例:連接數據庫(用戶可以create、add、update、delete)
interface UserInfoDao //D:data a:access o:object {public abstract void add();public abstract void deletde(); }class UserInfoByJDBC implements UserInfoDao //手寫連接數據庫 {public void add(){1、JDBC連接數據庫2、使用sql添加語句添加數據3、關閉數據庫連接}public void delete(){1、JDBC連接數據庫2、使用sql刪除語句刪除數據3、關閉數據庫連接} }class UserInfoByHibernate implements UserInfoDao //框架連接數據庫 {public void add(){1、Hibernate連接數據庫2、使用sql添加語句添加數據3、關閉數據庫連接}public void delete(){1、Hibernate連接數據庫2、使用sql刪除語句刪除數據3、關閉數據庫連接} }class DBoperate {public static void main(String[] args) {/* UserInfoDao ui = new UserInfoByJDBC(); //多態引用類型指向子類對象ui.add();ui.delete();UserInfoDao ui = new UserInfoByHibernate(); //多態引用類型指向子類對象ui.add();ui.delete();*/ui.add(new UserInfoByJDBC());ui.delete(new UserInfoByJDBC());ui.add(new UserInfoByHibernate());ui.delete(new UserInfoByHibernate());} }?
轉載于:https://www.cnblogs.com/XYQ-208910/p/4915480.html
總結
- 上一篇: Java使用多线程发送消息
- 下一篇: Javascript设计模式理论与实战: