林州網(wǎng)站建設(shè)外貿(mào)網(wǎng)站平臺(tái)
面向過(guò)程和面向?qū)ο蟮膮^(qū)別
面向過(guò)程:當(dāng)事件比較簡(jiǎn)單的時(shí)候,利用面向過(guò)程,注重的是事件的具體的步驟/過(guò)程,注重的是過(guò)程中的具體的行為,以函數(shù)為最小單位,考慮怎么做。
面向?qū)ο?#xff1a;注重找“參與者”,將功能封裝進(jìn)對(duì)象,強(qiáng)調(diào)具備了功能的對(duì)象,以類/對(duì)象為最小單位,考慮誰(shuí)來(lái)做。
二者相輔相成,并不是對(duì)立的。
解決復(fù)雜問(wèn)題,可以通過(guò)面向?qū)ο蠓绞?#xff0c;便于我們從宏觀上把握事物之間復(fù)雜的關(guān)系;具體到微觀操作,仍然使用面向過(guò)程方式來(lái)處理。
面向?qū)ο笕齻€(gè)階段
【1】面向?qū)ο蠓治鯫OA -- Object Oriented Analysis
- 從對(duì)象抽取出類
- 類里面有什么
- 動(dòng)詞--》動(dòng)態(tài)特性--》方法
- 名詞--》靜態(tài)特性--》屬性
【2】面向?qū)ο笤O(shè)計(jì)OOD -- Object Oriented Design
- 先有類,再有對(duì)象
【3】面向?qū)ο缶幊蘋OP -- Object Oriented Programming
如何理解Java的面向?qū)ο?/h2>
面向?qū)ο缶幊痰暮诵?#xff0c;主要是對(duì)象、類、封裝、繼承、多態(tài)以及抽象。
- 首先是將萬(wàn)事萬(wàn)物都看成一個(gè)個(gè)具體的對(duì)象,而類就是抽取一部分對(duì)象共同的屬性、行為等構(gòu)建的一個(gè)用于創(chuàng)建這類對(duì)象的模板;
- 封裝則是為了提高數(shù)據(jù)的安全性,通過(guò)訪問(wèn)修飾符去控制類的相關(guān)權(quán)限;
- 繼承則是通過(guò)子類繼承父類的屬性和方法來(lái)提高代碼的復(fù)用,當(dāng)然也是多態(tài)的前置條件;
- 而多態(tài)則是通過(guò)方法的重載和重寫,來(lái)簡(jiǎn)化程序的調(diào)用,提高代碼的靈活性和可拓展性;
- 最后則是抽象,通過(guò)抽象類和接口的方式,來(lái)解決單繼承的不足,進(jìn)一步提高代碼的可拓展性和可維護(hù)性。
面向?qū)ο笕筇匦?/h2>
封裝(Encapsulation)
封裝的本質(zhì),就是把該隱藏的隱藏起來(lái),該暴露的暴露出來(lái)。
封裝的主要目的是隱藏對(duì)象內(nèi)部的復(fù)雜性和實(shí)現(xiàn)細(xì)節(jié),只對(duì)外公開簡(jiǎn)單的接口。
封裝是一種信息隱藏技術(shù),在java中通過(guò)訪問(wèn)修飾符(如private、protected、public等)來(lái)實(shí)現(xiàn),控制用戶對(duì)類的修改和訪問(wèn)數(shù)據(jù)的程度,其中private是最嚴(yán)格的訪問(wèn)級(jí)別,它限制了類外部對(duì)類內(nèi)部成員的訪問(wèn)。
適當(dāng)?shù)姆庋b可以讓程式碼更容易理解和維護(hù),也加強(qiáng)了程式碼的安全性。
封裝的好處:
-
提高代碼的安全性:通過(guò)隱藏類的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),封裝可以防止外部代碼直接訪問(wèn)和修改類的內(nèi)部狀態(tài),從而減少了錯(cuò)誤的發(fā)生。
-
提高代碼的復(fù)用性:封裝使得類的內(nèi)部實(shí)現(xiàn)可以獨(dú)立于外部使用,因此可以在不同的上下文中重用同一個(gè)類。
-
提高代碼的可維護(hù)性:由于封裝隱藏了類的內(nèi)部實(shí)現(xiàn),因此當(dāng)需要修改類的內(nèi)部實(shí)現(xiàn)時(shí),只需要修改類的內(nèi)部代碼,而不需要修改使用該類的外部代碼。
封裝的設(shè)計(jì),也就是所謂的“高內(nèi)聚,低耦合”:
- 高內(nèi)聚:類的內(nèi)部數(shù)據(jù)操作細(xì)節(jié)自己完成,不允許外部干涉;
- 低耦合:僅對(duì)外暴露少量的方法用于使用。 隱藏對(duì)象內(nèi)部的復(fù)雜性,只對(duì)外公開簡(jiǎn)單的接口。便于外界調(diào)用,從而提高系統(tǒng)的可擴(kuò)展性、可維護(hù)性。
繼承(Inheritance)
繼承的本質(zhì)就是子類繼承父類所定義的內(nèi)容。
繼承就是讓一個(gè)類繼承另一個(gè)類的屬性和方法。通過(guò)繼承,子類可以重用父類的代碼,而不需要重新編寫相同的代碼。
繼承是代碼復(fù)用的重要手段之一,也是多態(tài)性的基礎(chǔ)。
繼承的好處:
-
提高代碼的復(fù)用性:子類可以繼承父類的屬性和方法,從而避免了代碼的重復(fù)編寫。
-
便于代碼的擴(kuò)展:通過(guò)繼承,可以在不修改父類代碼的情況下,通過(guò)擴(kuò)展子類來(lái)添加新的功能。
-
支持多態(tài)性:多態(tài)性是面向?qū)ο缶幊痰囊粋€(gè)重要特性。
注意:?
在Java中,一個(gè)類只能直接繼承一個(gè)父類(單繼承),但可以通過(guò)多層繼承來(lái)間接繼承多個(gè)類。
繼承具有傳遞性,即子類會(huì)繼承父類以及父類的父類(直到Object類)的所有非私有屬性和方法。
父類的私有成員(屬性和方法)雖然被子類繼承,但子類不能直接訪問(wèn)它們。子類只能通過(guò)父類提供的公共或受保護(hù)的方法來(lái)間接訪問(wèn)這些私有成員。
多態(tài)(Polymorphism)
多態(tài)的本質(zhì),就是通過(guò)對(duì)于同一個(gè)方法調(diào)用,然后由于其實(shí)現(xiàn)子類的不同,來(lái)實(shí)現(xiàn)不同的需求。
多態(tài)就是可以用統(tǒng)一的接口來(lái)操作不同的對(duì)象。當(dāng)通過(guò)父類類型的引用調(diào)用方法時(shí),由于多態(tài)的存在,會(huì)根據(jù)引用所指向的對(duì)象的實(shí)際類型來(lái)調(diào)用相應(yīng)的方法,這就實(shí)現(xiàn)了多態(tài)。
Java中的多態(tài)通過(guò)繼承和方法重寫實(shí)現(xiàn):
-
繼承:子類通過(guò)繼承獲得父類的屬性和方法,從而可以擴(kuò)展父類的功能。
-
方法重寫:子類根據(jù)需要重寫父類中的方法,以改變方法的行為。
多態(tài)的設(shè)計(jì),也就是所謂的“開閉原則”
- 對(duì)擴(kuò)展是開放:可以通過(guò)實(shí)現(xiàn)不同子類,實(shí)現(xiàn)不同的能力;
- 對(duì)修改關(guān)閉:避免了修改舊代碼。
類與類之間的關(guān)系
一、繼承關(guān)系
繼承指的是一個(gè)類(稱為子類、子接口)繼承另外的一個(gè)類(稱為父類、父接口)的功能,并可以增加它自己的新功能的能力。在Java中繼承關(guān)系通過(guò)關(guān)鍵字extends明確標(biāo)識(shí),在設(shè)計(jì)時(shí)一般沒(méi)有爭(zhēng)議性。
在UML類圖設(shè)計(jì)中,繼承用一條帶空心三角箭頭的實(shí)線表示,從子類指向父類,或者子接口指向父接口。
二、實(shí)現(xiàn)關(guān)系
實(shí)現(xiàn)指的是一個(gè)class類實(shí)現(xiàn)interface接口(可以是多個(gè))的功能,實(shí)現(xiàn)是類與接口之間最常見(jiàn)的關(guān)系。在Java中此類關(guān)系通過(guò)關(guān)鍵字implements明確標(biāo)識(shí),在設(shè)計(jì)時(shí)一般沒(méi)有爭(zhēng)議性。
在UML類圖設(shè)計(jì)中,實(shí)現(xiàn)用一條帶空心三角箭頭的虛線表示,從類指向?qū)崿F(xiàn)的接口。
三、依賴關(guān)系
簡(jiǎn)單的理解,依賴就是一個(gè)類A使用到了另一個(gè)類B,而這種使用關(guān)系是具有偶然性的、臨時(shí)性的、非常弱的,但是類B的變化會(huì)影響到類A。比如某人要過(guò)河,需要借用一條船,此時(shí)人與船之間的關(guān)系就是依賴。表現(xiàn)在代碼層面,讓類B作為參數(shù)被類A在某個(gè)method方法中使用。
在UML類圖設(shè)計(jì)中,依賴關(guān)系用由類A指向類B的帶箭頭虛線表示。
四、關(guān)聯(lián)關(guān)系
關(guān)聯(lián)體現(xiàn)的是兩個(gè)類之間語(yǔ)義級(jí)別的一種強(qiáng)依賴關(guān)系,比如我和我的朋友,這種關(guān)系比依賴更強(qiáng)、不存在依賴關(guān)系的偶然性、關(guān)系也不是臨時(shí)性的,一般是長(zhǎng)期性的,而且雙方的關(guān)系一般是平等的。關(guān)聯(lián)可以是單向、雙向的。表現(xiàn)在代碼層面,為被關(guān)聯(lián)類B以類的屬性形式出現(xiàn)在關(guān)聯(lián)類A中,也可能是關(guān)聯(lián)類A引用了一個(gè)類型為被關(guān)聯(lián)類B的全局變量。
在UML類圖設(shè)計(jì)中,關(guān)聯(lián)關(guān)系用由關(guān)聯(lián)類A指向被關(guān)聯(lián)類B的帶箭頭實(shí)線表示,在關(guān)聯(lián)的兩端可以標(biāo)注關(guān)聯(lián)雙方的角色和多重性標(biāo)記。
五、聚合關(guān)系
聚合是關(guān)聯(lián)關(guān)系的一種特例,它體現(xiàn)的是整體與部分的關(guān)系,即has-a的關(guān)系。此時(shí)整體與部分之間是可分離的,它們可以具有各自的生命周期,部分可以屬于多個(gè)整體對(duì)象,也可以為多個(gè)整體對(duì)象共享。比如計(jì)算機(jī)與CPU、公司與員工的關(guān)系等,比如一個(gè)航母編隊(duì)包括海空母艦、驅(qū)護(hù)艦艇、艦載飛機(jī)及核動(dòng)力攻擊潛艇等。表現(xiàn)在代碼層面,和關(guān)聯(lián)關(guān)系是一致的,只能從語(yǔ)義級(jí)別來(lái)區(qū)分。
在UML類圖設(shè)計(jì)中,聚合關(guān)系以空心菱形加實(shí)線箭頭表示。
六、組合關(guān)系
組合也是關(guān)聯(lián)關(guān)系的一種特例,它體現(xiàn)的是一種contains-a的關(guān)系,這種關(guān)系比聚合更強(qiáng),也稱為強(qiáng)聚合。它同樣體現(xiàn)整體與部分間的關(guān)系,但此時(shí)整體與部分是不可分的,整體的生命周期結(jié)束也就意味著部分的生命周期結(jié)束,比如人和人的大腦。表現(xiàn)在代碼層面,和關(guān)聯(lián)關(guān)系是一致的,只能從語(yǔ)義級(jí)別來(lái)區(qū)分。
在UML類圖設(shè)計(jì)中,組合關(guān)系以實(shí)心菱形加實(shí)線箭頭表示。
七、總結(jié)
對(duì)于繼承、實(shí)現(xiàn)這兩種關(guān)系沒(méi)多少疑問(wèn),它們體現(xiàn)的是一種類和類、或者類與接口間的縱向關(guān)系。其他的四種關(guān)系體現(xiàn)的是類和類、或者類與接口間的引用、橫向關(guān)系,是比較難區(qū)分的,有很多事物間的關(guān)系要想準(zhǔn)確定位是很難的。前面也提到,這四種關(guān)系都是語(yǔ)義級(jí)別的,所以從代碼層面并不能完全區(qū)分各種關(guān)系,但總的來(lái)說(shuō),后幾種關(guān)系所表現(xiàn)的強(qiáng)弱程度依次為:組合>聚合>關(guān)聯(lián)>依賴。
?
?