java 接口和抽象类的区别6_JAVA基础篇-接口和抽象类的区别
.前言
JAVA是一種面向?qū)ο笳Z(yǔ)言,具備抽象(Abstract),封裝(packing),繼承(extends),多態(tài)(polymorphic)四大特性。
我們重點(diǎn)從oop思想∠來(lái)分析。
.在面向?qū)ο蟮乃拇筇匦缘淖饔皿w現(xiàn)
抽象:父類(lèi)為子類(lèi)提供一些屬性和行為,子類(lèi)根據(jù)業(yè)務(wù)需求實(shí)現(xiàn)具體的行為(這時(shí)抽象類(lèi)派上了用場(chǎng),如工廠設(shè)計(jì)模式中的抽象工廠[AbstractFactoryClass])。
封裝:把對(duì)象的屬性和行為(方法)結(jié)合為一個(gè)獨(dú)立的整體,并盡可能隱藏對(duì)象的內(nèi)部實(shí)現(xiàn)細(xì)節(jié);java中的對(duì)屬性賦值(set)與取值(get)的隱藏與開(kāi)放能體現(xiàn)這一點(diǎn)。
繼承:子類(lèi)可以繼承父類(lèi)的所有非私有(private)特性,并可以重寫(xiě)父類(lèi)的除構(gòu)造函數(shù)之外的行為非私有與final方法,重寫(xiě)是用@overide標(biāo)記注解實(shí)現(xiàn),繼承體現(xiàn)出來(lái)的一般與特殊的關(guān)系即是抽象類(lèi)與子類(lèi)的關(guān)系。(比如交通工具與汽車(chē)的關(guān)系就是一般與特殊的關(guān)系,定義一個(gè)run()方法代表能跑,至于以何種方式跑得看具體的子類(lèi)怎么去實(shí)現(xiàn)這個(gè)run()方法了。)
多態(tài):接口和抽象類(lèi)共同奠基了多態(tài)的基調(diào),抽象類(lèi)本身更是一個(gè)類(lèi),可以有構(gòu)造函數(shù),可以有main函數(shù),可以定義一個(gè)沒(méi)有實(shí)現(xiàn)的抽象方法,子類(lèi)繼承抽象類(lèi)的時(shí)候必須要實(shí)現(xiàn)抽象類(lèi)的父類(lèi)抽象方法,考慮到里氏替換原則時(shí),子類(lèi)可以選擇性的實(shí)現(xiàn)父類(lèi)的方法,子類(lèi)也可以實(shí)現(xiàn)父類(lèi)沒(méi)有實(shí)現(xiàn)的接口。附加描述(一個(gè)類(lèi)中的方法重載也是體現(xiàn)多態(tài)的一種形式,因?yàn)槠浞祷仡?lèi)型以及方法名是一致的,唯一不一樣的是參數(shù)個(gè)數(shù)和參數(shù)類(lèi)型不一樣)
.補(bǔ)充
1.抽象類(lèi)可以實(shí)現(xiàn)多個(gè)接口,抽象類(lèi)本身是一個(gè)類(lèi),它可以有main函數(shù),因?yàn)槠淇梢杂袠?gòu)造函數(shù)。ASM編譯字節(jié)碼為證。當(dāng)它被實(shí)例一個(gè)對(duì)象時(shí),如果包含了抽象方法必須實(shí)現(xiàn)它的所有抽象方法。
// access flags 0x0
//編譯出來(lái)的構(gòu)造函數(shù)有init標(biāo)記
()V
L0
LINENUMBER 9 L0
ALOAD 0
INVOKESPECIAL AbstractClass. ()V
RETURN
L1
LOCALVARIABLE this LAbstractClass$1; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
2.接口可以繼承接口,自JAVA8開(kāi)始,接口可以有默認(rèn)的實(shí)現(xiàn)方法,用default關(guān)鍵字表達(dá),不可以靜態(tài)以接口名.default方法靜態(tài)形式調(diào)用,實(shí)現(xiàn)類(lèi)可以重寫(xiě)或直接擁有。在oop思想中,接口一般是定義同一類(lèi)事物的共同行為特性,接口中不能定義變量,默認(rèn)的屬性都是常量的即是final的.不過(guò)一般我們?cè)趯?shí)際開(kāi)發(fā)中,constant常量一般定義在枚舉中,因?yàn)槊杜e可以構(gòu)造多個(gè)參數(shù)并且可以有建立一個(gè)主鍵與多個(gè)描述字段的一對(duì)多映射關(guān)系。
what is purpose of default modifier?
enable new functionality to be added to the interfaces of libraries and ensure binary compatibility with code written for older versions of those interfaces.
3.在OOP面向?qū)ο缶幊讨?由于接口和抽象類(lèi)是真正用來(lái)體現(xiàn)設(shè)計(jì)思想的一種方式,尤其是設(shè)計(jì)模式中的講究,設(shè)計(jì)模式才是設(shè)計(jì)的精髓,一切都遵循對(duì)象的六大原則設(shè)計(jì)特點(diǎn)(1.單一職責(zé)原則(Single Responsibility Principle SRP)開(kāi)閉原則(Open Close Principle OCP)||里氏替換原則(Liskov Substitution Principle LSP)||依賴倒轉(zhuǎn)原則(Dependence Inversion Principle DIP)|| 接口隔離原則(Interface Segregation Principle ISP)||迪米特原則 (Least Knowledge Principle LKP)),所以在具體設(shè)計(jì)時(shí)一定要根據(jù)實(shí)際的業(yè)務(wù)需求場(chǎng)景在接口和抽象類(lèi)中做出最優(yōu)的抉擇,當(dāng)然很多情況下是可以在一起用的。
4.接口和抽象類(lèi)的相同點(diǎn):
(1) 都可以被繼承
(2) 都不能被實(shí)例化
(3) 都可以包含方法聲明
(4) 派生類(lèi)必須實(shí)現(xiàn)未實(shí)現(xiàn)的方法
總結(jié)
以上是生活随笔為你收集整理的java 接口和抽象类的区别6_JAVA基础篇-接口和抽象类的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 搭建Linux的基础命令符---bc
- 下一篇: python手写lfw数据集转pair.