面向?qū)ο?/h1>
面向?qū)ο蟾攀?/span>
面向?qū)ο蠛兔嫦蜻^程的區(qū)別
面向過程:
優(yōu)點(diǎn):性能比面向?qū)ο蟾?,因?yàn)轭愓{(diào)用時(shí)需要實(shí)例化,開銷比較大,比較消耗資源;比如單片機(jī)、嵌入式 開發(fā)、Linux/Unix等一般采用面向過程開發(fā),能是最重要的因素。
缺點(diǎn):沒有面向?qū)ο笠拙S護(hù)、易復(fù)用、易擴(kuò)展?
面向?qū)ο螅?/strong>
優(yōu)點(diǎn):易維護(hù)、易復(fù)用、易擴(kuò)展,由于面向?qū)ο笥蟹庋b、繼承、多態(tài)性的特性,可以設(shè)計(jì)出低耦合的系 統(tǒng),使系統(tǒng)更加靈活、更加易于維護(hù)?
缺點(diǎn):性能比面向過程低 面向過程是具體化的,流程化的,解決一個(gè)問題,你需要一步一步的分析,一步 一步的實(shí)現(xiàn)。
面向?qū)ο笫悄P突?,你只需抽象出一個(gè)類,這是一個(gè)封閉的盒子,在這里你擁有數(shù)據(jù)也擁有解決問題 的方法。需要什么功能直接使用就可以了,不必去一步一步的實(shí)現(xiàn),至于這個(gè)功能是如何實(shí)現(xiàn)的,管我 們什么事?我們會用就可以了。 面向?qū)ο蟮牡讓悠鋵?shí)還是面向過程,把面向過程抽象成類,然后封裝,方便我們使用的就是面向?qū)ο?了。
面向?qū)ο笕筇匦?/span>
面向?qū)ο蟮奶卣饔心男┓矫?
面向?qū)ο蟮奶卣髦饕幸韵聨讉€(gè)方面:
抽象:抽象是將一類對象的共同特征總結(jié)出來構(gòu)造類的過程,包括數(shù)據(jù)抽象和行 為抽象兩方面。抽象只 關(guān)注對象有哪些屬性和行為,并不關(guān)注這些行為的細(xì)節(jié)是 什么。
封裝 : 封裝把一個(gè)對象的屬性私有化,同時(shí)提供一些可以被外界訪問的屬性的方法,如 果屬性不想 被外界訪問,我們大可不必提供方法給外界訪問。但是如果一個(gè)類沒 有提供給外界訪問的方法,那 么這個(gè)類也沒有什么意義了。?
繼承 : 繼承是使用已存在的類的定義作為基礎(chǔ)建立新類的技術(shù),新類的定義可以增加新 的數(shù)據(jù)或新 的功能,也可以用父類的功能,但不能選擇性地繼承父類。通過使用 繼承我們能夠非常方便地復(fù)用 以前的代碼。?
關(guān)于繼承如下 3 點(diǎn)請記?。?/strong>
? ? ?1.子類擁有父類非 private 的屬性和方法。
? ? ?2.子類可以擁有自己屬性和方法,即子類可以對父類進(jìn)行擴(kuò)展。
? ? ?3.子類可以用自己的方式實(shí)現(xiàn)父類的方法。?
多態(tài) : 所謂多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出 的方法調(diào)用 在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定,即一個(gè)引用變量到 底會指向哪個(gè)類的實(shí)例對象, 該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的 方法,必須在由程序運(yùn)行期間才能決定。
在Java中有兩種形式可以實(shí)現(xiàn)多態(tài):繼承(多個(gè)子類對同一方法的重寫)和接口 (實(shí)現(xiàn)接口并覆蓋 接口中同一方法)。
其中Java 面向?qū)ο缶幊倘筇匦裕悍庋b 繼承 多態(tài)
封裝:隱藏對象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對外提供公共訪問方式,將變化隔離,便 于使用,提高復(fù)用性和 安全性。?
繼承:繼承是使用已存在的類的定義作為基礎(chǔ)建立新類的技術(shù),新類的定義可以 增加新的數(shù)據(jù)或新的功 能,也可以用父類的功能,但不能選擇性地繼承父類。通 過使用繼承可以提高代碼復(fù)用性。繼承是多態(tài) 的前提。
關(guān)于繼承如下 3 點(diǎn)請記?。?/p>
1. 子類擁有父類非 private 的屬性和方法。
2. 子類可以擁有自己屬性和方法,即子類可以對父類進(jìn)行擴(kuò)展。
3. 子類可以用自己的方式實(shí)現(xiàn)父類的方法。?
多態(tài)性:父類或接口定義的引用變量可以指向子類或具體實(shí)現(xiàn)類的實(shí)例對象。提 高了程序的拓展性。 在Java中有兩種形式可以實(shí)現(xiàn)多態(tài):繼承(多個(gè)子類對同一方法的重寫)和接口 (實(shí)現(xiàn)接口并覆蓋接口 中同一方法)。?
方法重載(overload)實(shí)現(xiàn)的是編譯時(shí)的多態(tài)性(也稱為前綁定),而方法重 寫(override)實(shí)現(xiàn)的是 運(yùn)行時(shí)的多態(tài)性(也稱為后綁定)。
一個(gè)引用變量到底會指向哪個(gè)類的實(shí)例對象,該引用變量發(fā)出的方法調(diào)用到底是 哪個(gè)類中實(shí)現(xiàn)的方法, 必須在由程序運(yùn)行期間才能決定。運(yùn)行時(shí)的多態(tài)是面向?qū)?象精髓的東西,要實(shí)現(xiàn)多態(tài)需要做兩件事:?
方法重寫(子類繼承父類并重寫父類中已有的或抽象的方法);
對象造型(用父類型引用子類型對象,這樣同樣的引用調(diào)用同樣的方法就會根據(jù) 子類對象的不同而 表現(xiàn)出不同的行為)。
什么是多態(tài)機(jī)制?Java語言是如何實(shí)現(xiàn)多態(tài)的?
所謂多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出 的方法調(diào)用在編程時(shí)并 不確定,而是在程序運(yùn)行期間才確定,即一個(gè)引用變量倒 底會指向哪個(gè)類的實(shí)例對象,該引用變量發(fā)出 的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的 方法,必須在由程序運(yùn)行期間才能決定。因?yàn)樵诔绦蜻\(yùn)行時(shí)才確定具 體的類,這 樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實(shí)現(xiàn)上,從而 導(dǎo)致該引用 調(diào)用的具體方法隨之改變,即不修改程序代碼就可以改變程序運(yùn)行時(shí) 所綁定的具體代碼,讓程序可以選 擇多個(gè)運(yùn)行狀態(tài),這就是多態(tài)性。多態(tài)分為編譯時(shí)多態(tài)和運(yùn)行時(shí)多態(tài)。其中編輯時(shí)多態(tài)是靜態(tài)的,主要 是指方法的 重載,它是根據(jù)參數(shù)列表的不同來區(qū)分不同的函數(shù),通過編輯之后會變成兩個(gè)不 同的函數(shù), 在運(yùn)行時(shí)談不上多態(tài)。而運(yùn)行時(shí)多態(tài)是動態(tài)的,它是通過動態(tài)綁定來 實(shí)現(xiàn)的,也就是我們所說的多態(tài)性
多態(tài)的實(shí)現(xiàn)?
Java實(shí)現(xiàn)多態(tài)有三個(gè)必要條件:繼承、重寫、向上轉(zhuǎn)型。
繼承:在多態(tài)中必須存在有繼承關(guān)系的子類和父類。?
重寫:子類對父類中某些方法進(jìn)行重新定義,在調(diào)用這些方法時(shí)就會調(diào)用子類的 方法。
向上轉(zhuǎn)型:在多態(tài)中需要將子類的引用賦給父類對象,只有這樣該引用才能夠具 備技能調(diào)用父類的方法 和子類的方法。
只有滿足了上述三個(gè)條件,我們才能夠在同一個(gè)繼承結(jié)構(gòu)中使用統(tǒng)一的邏輯實(shí)現(xiàn) 代碼處理不同的對象, 從而達(dá)到執(zhí)行不同的行為。
對于Java而言,它多態(tài)的實(shí)現(xiàn)機(jī)制遵循一個(gè)原則:當(dāng)超類對象引用變量引用子類 對象時(shí),被引用對象的 類型而不是引用變量的類型決定了調(diào)用誰的成員方法,但 是這個(gè)被調(diào)用的方法必須是在超類中定義過 的,也就是說被子類覆蓋的方法。
面向?qū)ο笪宕蠡驹瓌t是什么(可選)
單一職責(zé)原則SRP(Single Responsibility Principle)類的功能要單一,不能包羅萬象,跟雜貨鋪似的。
開放封閉原則OCP(Open-Close Principle)?
一個(gè)模塊對于拓展是開放的,對于修改是封閉的,想要增加功能熱烈歡迎,想要修改, 一萬個(gè)不樂意。
里式替換原則LSP(the Liskov Substitution Principle LSP)子類可以替換父類出現(xiàn)在父類能夠出現(xiàn)的 任何地方。比如你能代表你爸去你姥姥家干活。
依賴倒置原則DIP(the Dependency Inversion Principle DIP)高層次的模塊不應(yīng)該依賴于低層次的 模塊,他們都應(yīng)該依賴于抽象。抽象不應(yīng)該依賴于具體實(shí)現(xiàn),具體實(shí)現(xiàn)應(yīng)該依賴于抽象。就是你出 國要說你是中國人,而不能說你是哪個(gè)村子的。比如說中國人是抽象的,下面有具體的xx省,xx 市,xx縣。你要依賴的抽象是中國人,而不是你是xx村的。
接口分離原則ISP(the Interface Segregation Principle ISP) 設(shè)計(jì)時(shí)采用多個(gè)與特定客戶類有關(guān)的接口比采用一個(gè)通用的接口要好。就比如一個(gè)手機(jī)擁有 打電話,看視頻,玩游戲等功能,把這幾個(gè)功能拆分成不同的接口,比在一個(gè)接口里要好的多。