編程思想(一):面向對象思想及衍生特性

1、爲什麼要使用面向對象的思想進行程序設計?
a、好處:使用面向對象能讓開發變得更簡單高效,易於維護。
b、難點:
如何設計可重用的類是開發過程中的難點,且最耗費時間精力,當然這是核心編程人員的工作內容。
如果你只想成爲一個普通的碼農,而不是真正意義上的程序員,你只需要關注,如何調用這些類,並熟練使用即可
2、面向對象思想的起源
早期將所有問題抽象爲算法,現在將問題的元素抽象爲項目的多個對象,多個對象之間進行組合,靈活地解決實際問題。從某種層面上來說,面向對象的思想,是一種更好的語言抽象方法。所有的編程語言,最終目的是提供一種抽象方法。
a、現實問題:我們設計程序,就是通過計算機技術模擬現實,解決項目的業務邏輯,從而創造價值。
b、技術方案
一種是調用現有接口、類,創建對象,並通過邏輯思維,在計算機中實現對現實的模擬。
另一種則是,自己寫接口、類,實現業務功能。當然,最常見的情況是兩者皆有。調用常用接口,自定義特殊接口(類)
c、必修:若僅僅是調用現有接口實現業務功能,那麼必修課就是要熟悉有哪些類可供調用,每個類都有哪些方法
d、重點
若需要自己寫類來實現業務功能,那麼就意味着我們需要使用面向對象的思想,通過生活經驗、業務場景以及洞察力,從現實中抽象出我們需要使用的對象,每個對象都能存儲特徵(變量)、行爲(方法)。
抽象的能力決定了解決問題的複雜程度,抽象的能力取決於兩個,一個是抽象的種類(對什麼進行抽象),一個是抽象的質量。
e、例如:類是對大量對象的抽象,機器語言抽象出彙編語言,彙編語言抽象出高級語言。
f、編程的挑戰/面向對象的最大挑戰:準確地爲實際要解決的問題模型與機器模型創造聯繫,且是一一對應的映射關係。
3、關於對象:特徵+行爲
a、所有東西都是對象,對象存儲着數據,可要求對象對自身進行操作
b、可以從要解決的問題中抽取出所有概念組件,這些概念組件組合成一個對象。
c、程序是一大堆對象的組合,每個對象都有自己的空間,可以容納其他對象。
d、每個對象都有對應的類型,都是一個類的實例。
e、每個對象僅能接受特定的請求(命令/方法),我們向對象發出的請求是通過它的接口(類)定義的,對象的類規定了它的接口形式。所以,我們常常提到的接口可以指:類、也可以指某個方法。
4、面向對象的深入
     從面向對象思想,到將實際問題模型轉化成機器模型需要抽象的能力,從早期的算法抽象思維演變爲面向對象的抽象思維。從現實問題模型中抽象出類/接口,再到類的創建與調用。類的創建包含兩部分,成員變量與成員函數。類的建立直接實現了類的重用性。類的重用性是面向對象的一個重要特性。以上談的內容都是都是一個類的組成、設計、創建、使用。現在,我們談談不同類之間的繼承性。類的繼承性也是面向對象的一個重要特性。
a、類的設計:想設計好的類,必須要有豐富的經驗、對業務場景十分熟悉、以及深刻的洞察力(觀察與深入的思考)
b、類的創建:類創建者可以使用權限修飾符對類進行權限管理。
那麼爲什麼需要對類進行權限管理?關於隱藏的實現的設計.因爲,類的創建者提供接口的同時,要避免被類的調用者篡改,若類代碼被篡改,那麼該接口的其他調用者也會受此影響.因此,常常將成員變量隱藏(private),僅提供成員方法的接口(public)。private爲類的創建者和調用者之間,豎起一道屏障。
權限修飾符:public、protected、default(friendly封裝)、private,public意味着對不同包也是開放的,B包中的類訪問A包中的類相當於客戶端,也就是調用者
類的結構範圍:類內部、類外部(同一個包)、父子類、不同包
c、類的調用:類調用者有權使用該類/接口,但無法接觸和修改細節。
d、類的繼承
1、繼承extends使得子類複製了父類的接口;
2、基礎類(父類)與衍生類(子類)有相同的類型。衍生類有基礎類的接口,基礎類沒有衍生類的接口
5、abstract抽象類與interface接口
a、爲什麼會有抽象類?
      設計程序時,我們希望基礎類只爲衍生類提供接口。因此,用abstract解決這個問題。抽象類就像一個導師,它有強大的理論基礎,但實踐能力不強。導師希望能將自己的知識傳遞下去,但是不希望自己的弟子照搬照套自己的方法。因此,使用abstract關鍵字修飾類,這樣可以防止弟子創建對象(創建抽象類時,編譯器會提示),並直接套用自己的方法。這樣弟子extends導師的方法,但是具體怎麼實現方法,還是靠弟子自己。抽象類和接口就像一個導航,它會告訴你該去什麼方向,但是怎麼走,還是靠你自己。
      另外,抽象方法只能在抽象類中創建。
b、interface接口
      接口延伸了抽象類的概念,它完全禁止所有函數的定義。接口與接口之間是支持多繼承的。
6、對象的存在時間
如何控制對象的存在時間?
a、c++:可以指定在什麼時候銷燬對象,但是前提是我們要知道對象的類型、數量、存在時間。這種方法的優點是可以在對象使用後就銷燬,節省內存空間,提升運行速度,缺點是不夠靈活,要設定每個對象在什麼時候銷燬,開發進度較長。
b、動態地創建和銷燬對象:使用垃圾回收器進行銷燬對象。通常使用new命令爲對象的創建,申請分配內存。內存的分配方式有以下兩種。
內存的靜態分配方式:分配的內存大小、壽命在編譯器就都已確定。
內存的動態分配方式:分配的內存大小、壽命都不確定,例如,內存池就是使用一種動態分配方式。
內存池:內存池也叫內存堆,在運行期,採用動態的方式申請分配內存,由於分配的內存大小不定,因此,在內存分配不夠的時候,就會繼續申請。若頻繁使用內存池,會造成內存碎片(外部碎片),從而降低性能。
內存碎片:分爲內部碎片和外部碎片。內存碎片從本質上來看,就是被佔用,但不被真正使用的內存空間。
內部碎片:申請內存時,必須申請4、8、16的倍數的內存空間,若此時你需要7個字節大小的內存空間,實際申請的是8個字節的內存空間。這樣就有1個字節的內存空間碎片。
外部碎片:申請內存時,是按照內存的地址值的順序進行申請。例如前20個地址值都被使用了,且有一個內存大小爲4個字節的空間剛剛被釋放,但是之後創建對象時,若都是申請大於4個字節的空間,那麼這個被釋放的空間一直處於不能被再次使用的狀態。這個空間就是內存(外部)碎片
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章