Java接口和抽象類有什么區(qū)別
接口(interface)和抽象類(abstract class)是支持抽象類定義的兩種機(jī)制。
接口是公開的,不能有私有的方法或變量,接口中的所有方法都沒(méi)有方法體,通過(guò)關(guān)鍵字interface實(shí)現(xiàn)。
接口(英文:Interface),在JAVA編程語(yǔ)言中是一個(gè)抽象類型,是抽象方法的集合,接口通常以interface來(lái)聲明。一個(gè)類通過(guò)繼承接口的方式,從而來(lái)繼承接口的抽象方法。
接口并不是類,編寫接口的方式和類很相似,但是它們屬于不同的概念。類描述對(duì)象的屬性和方法。接口則包含類要實(shí)現(xiàn)的方法。
除非實(shí)現(xiàn)接口的類是抽象類,否則該類要定義接口中的所有方法。
接口無(wú)法被實(shí)例化,但是可以被實(shí)現(xiàn)。一個(gè)實(shí)現(xiàn)接口的類,必須實(shí)現(xiàn)接口內(nèi)所描述的所有方法,否則就必須聲明為抽象類。另外,在 Java 中,接口類型可用來(lái)聲明一個(gè)變量,他們可以成為一個(gè)空指針,或是被綁定在一個(gè)以此接口實(shí)現(xiàn)的對(duì)象。
抽象類是可以有私有方法或私有變量的,通過(guò)把類或者類中的方法聲明為abstract來(lái)表示一個(gè)類是抽象類,被聲明為抽象的方法不能包含方法體。子類實(shí)現(xiàn)方法必須含有相同的或者更低的訪問(wèn)級(jí)別(public->protected->private)。抽象類的子類為父類中所有抽象方法的具體實(shí)現(xiàn),否則也是抽象類。
接口可以被看作是抽象類的變體,接口中所有的方法都是抽象的,可以通過(guò)接口來(lái)間接的實(shí)現(xiàn)多重繼承。接口中的成員變量都是static final類型,由于抽象類可以包含部分方法的實(shí)現(xiàn),所以,在一些場(chǎng)合下抽象類比接口更有優(yōu)勢(shì)。
相同點(diǎn):
(1)都不能被實(shí)例化
(2)接口的實(shí)現(xiàn)類或抽象類的子類都只有實(shí)現(xiàn)了接口或抽象類中的方法后才能實(shí)例化。
不同點(diǎn):
(1)接口只有定義,不能有方法的實(shí)現(xiàn),java 1.8中可以定義default方法體,而抽象類可以有定義與實(shí)現(xiàn),方法可在抽象類中實(shí)現(xiàn)。
(2)實(shí)現(xiàn)接口的關(guān)鍵字為implements,繼承抽象類的關(guān)鍵字為extends。一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但一個(gè)類只能繼承一個(gè)抽象類。所以,使用接口可以間接地實(shí)現(xiàn)多重繼承。
(3)接口強(qiáng)調(diào)特定功能的實(shí)現(xiàn),而抽象類強(qiáng)調(diào)所屬關(guān)系。
(4)接口成員變量默認(rèn)為public static final,必須賦初值,不能被修改;其所有的成員方法都是public、abstract的。抽象類中成員變量默認(rèn)default,可在子類中被重新定義,也可被重新賦值;抽象方法被abstract修飾,不能被private、static、synchronized和native等修飾,必須以分號(hào)結(jié)尾,不帶花括號(hào)。
(5)接口被用于常用的功能,便于日后維護(hù)和添加刪除,而抽象類更傾向于充當(dāng)公共類的角色,不適用于日后重新對(duì)立面的代碼修改。功能需要累積時(shí)用抽象類,不需要累積時(shí)用接口。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Servlet實(shí)現(xiàn)點(diǎn)擊計(jì)數(shù)器的方法
這篇文章主要介紹了Servlet實(shí)現(xiàn)點(diǎn)擊計(jì)數(shù)器的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
推薦一款I(lǐng)ntelliJ IDEA提示快捷鍵的Key Promoter X插件
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA提示快捷鍵的Key Promoter X插件,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
java寫卷積神經(jīng)網(wǎng)絡(luò)(CupCnn簡(jiǎn)介)
這篇文章主要介紹了java寫卷積神經(jīng)網(wǎng)絡(luò)(CupCnn簡(jiǎn)介),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
關(guān)于Spring?Ioc和DI注解的問(wèn)題
這篇文章主要介紹了Spring?Ioc和DI注解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
springboot集成redis實(shí)現(xiàn)消息的訂閱與發(fā)布
本文主要介紹了springboot集成redis實(shí)現(xiàn)消息的訂閱與發(fā)布,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
SpringSecurity多認(rèn)證器配置多模式登錄自定義認(rèn)證器方式
這篇文章主要介紹了SpringSecurity多認(rèn)證器配置多模式登錄自定義認(rèn)證器方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
詳解Mybatis逆向工程中使用Mysql8.0版本驅(qū)動(dòng)遇到的問(wèn)題
今天在使用 8.0.12 版的 mysql 驅(qū)動(dòng)時(shí)遇到了各種各樣的坑。這篇文章主要介紹了詳解Mybatis逆向工程中使用Mysql8.0版本驅(qū)動(dòng)遇到的問(wèn)題,感興趣的小伙伴們可以參考一下2018-10-10

