面向對象、繼承封裝、多態小例子(馬士兵)


面向對象

談談面向對象吧?

核心思想:封裝、繼承、多態

一:抽象封裝

答:嗯...(思考幾秒)那我就舉個例子吧:就用面向對象思維封裝“老張開車去東北”吧。

最原始的,就用一mian方法,打印:

System.out.println("老張開車去東北!");

下一步封裝,比如,把人物“老張”,交通工具“車”,目的地“東北”,抽取出來,提取成變量:

String driverName = "老張";
String vehicle = "車";
String targetPlace = "東北";
System.out.println(driverName+"開"+vehicle+ "去"+targetPlace);

進一步封裝,可以封裝成一個方法:

這還不夠面向對象,面向對象拿到一個問題,首先要考慮問題域里面有哪些對象。考慮類:一般問題域里面的名詞,就是對象,或者對象的屬性(不可脫離具體的應用環境),動詞是方法。比如這個問題里面:

隱藏封裝(降低耦合度):屬性定義為private 私有的,對外提供get、set方法,也是一種隱藏和封裝,比如不想讓別人修改某個屬性,把set方法去掉就可以。比如可以在get方法里添加判斷,看你是否有權利get該屬性。

司機Driver:

  • 屬性:name

  • 方法:drive(開車)

車Car :

  • 方法: go()

地址Address

  *   屬性:name

要考慮 類和類之間的關系:司機和車之間是有關系的,司機可以開車,可以把車定義為司機的一個屬性(這輛車就屬於這個司機),也可以把車傳個司機的開車方法drive(Car c)(司機可以開任何車);

代碼:

測試類:

現在如果不想開着車去,想開飛機,怎么辦呢?再寫個類:飛機Plane

​ 司機再加個drive的重載方法:

這樣就可以了。這樣的問題是可擴展性不好,隨着交通工具的增多,司機類的drive方法需要繼續重載,可不可以讓司機只有一個drive方法,就能drive所有的交通工具呢?

這就要用到繼承了。

二:繼承

可以。寫個交通工具類Vehicle,這個類是抽象的:

然后司機類里面,drive方法傳入Vehicle交通工具,

然后讓Car和Plane都繼承Vehicle,重寫go方法:

測試類:

這樣在用戶使用的時候,傳入是Car,就調用Car的go方法,傳入的是Plane,就調用Plane的go方法,這就叫多態

發生多態的三個條件:要有繼承,要有重寫,父類引用指向子類對象

多態的耦合性比較高,父類的修改會影響子類,需要慎重使用

多態的好處:可擴展性高了,這就是面向對象的精華

如果再添加其他交通工具,只需要添加類,然后繼承Vehicle類就好了。

接口和抽象類的區別:

如果你腦子里有一個具體的事物,比如交通工具,就設計為抽象類。

如果你腦子里沒有具體的事物,只有一類事物,或者幾類事物的特征,比如說,會飛的、會跑的,就定義為接口,runnable、Moveable,比如上例中的Vehicle,就可以設計成Moveable,

然后里面有個方法,run(), 然后Car、Plane都實現這個接口即可。

歡迎關注個人公眾號交流學習:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM