java 接口和抽象类的区别6_JAVA基础篇-接口和抽象类的区别
.前言
JAVA是一種面向對象語言,具備抽象(Abstract),封裝(packing),繼承(extends),多態(polymorphic)四大特性。
我們重點從oop思想∠來分析。
.在面向對象的四大特性的作用體現
抽象:父類為子類提供一些屬性和行為,子類根據業務需求實現具體的行為(這時抽象類派上了用場,如工廠設計模式中的抽象工廠[AbstractFactoryClass])。
封裝:把對象的屬性和行為(方法)結合為一個獨立的整體,并盡可能隱藏對象的內部實現細節;java中的對屬性賦值(set)與取值(get)的隱藏與開放能體現這一點。
繼承:子類可以繼承父類的所有非私有(private)特性,并可以重寫父類的除構造函數之外的行為非私有與final方法,重寫是用@overide標記注解實現,繼承體現出來的一般與特殊的關系即是抽象類與子類的關系。(比如交通工具與汽車的關系就是一般與特殊的關系,定義一個run()方法代表能跑,至于以何種方式跑得看具體的子類怎么去實現這個run()方法了。)
多態:接口和抽象類共同奠基了多態的基調,抽象類本身更是一個類,可以有構造函數,可以有main函數,可以定義一個沒有實現的抽象方法,子類繼承抽象類的時候必須要實現抽象類的父類抽象方法,考慮到里氏替換原則時,子類可以選擇性的實現父類的方法,子類也可以實現父類沒有實現的接口。附加描述(一個類中的方法重載也是體現多態的一種形式,因為其返回類型以及方法名是一致的,唯一不一樣的是參數個數和參數類型不一樣)
.補充
1.抽象類可以實現多個接口,抽象類本身是一個類,它可以有main函數,因為其可以有構造函數。ASM編譯字節碼為證。當它被實例一個對象時,如果包含了抽象方法必須實現它的所有抽象方法。
// access flags 0x0
//編譯出來的構造函數有init標記
()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開始,接口可以有默認的實現方法,用default關鍵字表達,不可以靜態以接口名.default方法靜態形式調用,實現類可以重寫或直接擁有。在oop思想中,接口一般是定義同一類事物的共同行為特性,接口中不能定義變量,默認的屬性都是常量的即是final的.不過一般我們在實際開發中,constant常量一般定義在枚舉中,因為枚舉可以構造多個參數并且可以有建立一個主鍵與多個描述字段的一對多映射關系。
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面向對象編程中,由于接口和抽象類是真正用來體現設計思想的一種方式,尤其是設計模式中的講究,設計模式才是設計的精髓,一切都遵循對象的六大原則設計特點(1.單一職責原則(Single Responsibility Principle SRP)開閉原則(Open Close Principle OCP)||里氏替換原則(Liskov Substitution Principle LSP)||依賴倒轉原則(Dependence Inversion Principle DIP)|| 接口隔離原則(Interface Segregation Principle ISP)||迪米特原則 (Least Knowledge Principle LKP)),所以在具體設計時一定要根據實際的業務需求場景在接口和抽象類中做出最優的抉擇,當然很多情況下是可以在一起用的。
4.接口和抽象類的相同點:
(1) 都可以被繼承
(2) 都不能被實例化
(3) 都可以包含方法聲明
(4) 派生類必須實現未實現的方法
總結
以上是生活随笔為你收集整理的java 接口和抽象类的区别6_JAVA基础篇-接口和抽象类的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搭建Linux的基础命令符---bc
- 下一篇: 笔试常见的智力题(附答案)