抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final 類型的
抽象類只能繼承一個,接口可以實現(xiàn)多個。
接口的設(shè)計目的,是對類的行為進(jìn)行約束(更準(zhǔn)確的說是一種“有”約束,因為接口不能規(guī)定類不可以有什么行為),也就是提供一種機(jī)制,可以強(qiáng)制要求不同的類具有相同的行為,它只約束了行為的有無,但不對如何實現(xiàn)行為進(jìn)行限制。
而抽象類的設(shè)計目的,是代碼復(fù)用。當(dāng)不同的類具有某些相同的行為(記為行為集合),且其中一部分行為的實現(xiàn)方式一致時(A的非真子集,記為B)可以讓這些類都派生與一個抽象類,在這個抽象類中實現(xiàn)了B,避免讓所有的子類來實現(xiàn)B,這就達(dá)到了代碼復(fù)用的目的。而A減去B的部分,留給各個子類自己實現(xiàn),正是因為A-B在這里沒有實現(xiàn),所以抽象類不允許實例化出來(否則當(dāng)調(diào)用到A-B時,無法執(zhí)行)。
抽象類是對類本質(zhì)的抽象,表達(dá)的是is-a的關(guān)系,比如:BMW is a car 。抽象類包含并實現(xiàn)子類的通用特性,將子類存在差異化的特性進(jìn)行抽象,交由子類去實現(xiàn)。
而接口是對行為的抽象,表達(dá)的是like a的關(guān)系,比如:bird like a aircraft(像飛行器一樣飛),但其本質(zhì)上 is a bird 。接口的核心是定義行為,至于實現(xiàn)主體是誰,是如何實現(xiàn),接口并不關(guān)心。
使用場景:當(dāng)你關(guān)注一個事物的本質(zhì)的時候,用抽象類;當(dāng)你關(guān)注一個操作的時候,用接口
抽象類的能力要遠(yuǎn)超過接口,但是,定義抽象類的代價高,因為高級語言來說(從實際設(shè)計上來說也是)每個類只能繼承一個類,在這個類中,你必須繼承或編寫出其所有子類的所有共性。雖然接口在功能上會弱化許多,但是它只是針對一個動作的描述,而且你可以在一個類中同時實現(xiàn)多個接口,在設(shè)計階段會降低難度 8、List和Set
Customer的屬性名稱是person,Spring會將bean id為person的bean通過setter方法進(jìn)行自動裝配。 <bean id = &#34;customer&#34; class = &#34;com.xxx.xxx.Cutomer&#34; autowire =&#34;byName&#34; /> <bean id =&#34;person&#34; class =&#34;com.xxx.xxx.Person&#34; />
3 、byType-根據(jù)bean的類型進(jìn)行自動裝配
Cutomer的屬性person的類型為Person,Spring會將Person類型通過setter方法進(jìn)行自動裝配。 <bean id =&#34;cutomer&#34; class = &#34;com.xxx.xxx.Cutomer&#34; autowire =&#34;byType&#34; /> <bean id = &#34;person&#34; class =&#34;com.xxx.xxx.Person&#34; />
Cutomer構(gòu)造函數(shù)的參數(shù)person的類型為Person,Spring會將Person類型通過構(gòu)造方法進(jìn)行自動裝配。 <bean id =&#34;cutomer&#34; class =&#34;com.xxx.xxx.Cutomer&#34; autowire =&#34;construtor&#34; /> <bean id =&#34;person&#34; class =&#34;com.xxx.xxx.Person&#34; />
主從同步的時候,電商下單---->支付insert master db select 數(shù)據(jù),因為數(shù)據(jù)同步延遲導(dǎo)致查不到這個數(shù)據(jù)。加cache(不是最好的解決方式)數(shù)據(jù)要求比較嚴(yán)謹(jǐn)?shù)脑挷閙aster主庫