2019.7.30更新:以前的整理可能難于理解,現(xiàn)在再整一次(針對(duì)jdk1.8及以上)。
接口:
不是一個(gè)類(lèi)(也沒(méi)有繼承Object),不能實(shí)例化,但是可以聲明一個(gè)未初始化變量。不能有私有的成員變量或者方法。(參照菜鳥(niǎo)教程)
·??變量默認(rèn)是public static final 修飾,方法默認(rèn)是public abstract;
·??default修飾的方法必須有方法體,并且該接口的實(shí)現(xiàn)類(lèi)非必須實(shí)現(xiàn)defualt方法。static方法必須有方法體
·??如果該接口(A)的實(shí)現(xiàn)類(lèi)(AA)沒(méi)有實(shí)現(xiàn)A中所有的public方法,那么AA一定為abstract抽象類(lèi)。之后在AA的子類(lèi)或者實(shí)現(xiàn)類(lèi)中,需要繼續(xù)重寫(xiě)AA 沒(méi)有實(shí)現(xiàn)的方法。
抽象類(lèi):
除了不能實(shí)例化,其余跟普通的類(lèi)沒(méi)有區(qū)別。不同于接口,正常類(lèi)可以實(shí)例多個(gè)接口,但只能繼承一個(gè)類(lèi)。
· 抽象類(lèi)中的抽象方法一定是public abstract
· 抽象類(lèi)中不一定有抽象方法
以前的:
1.本質(zhì)上來(lái)講,接口也是一種類(lèi),是一種特殊的抽象類(lèi),但是這個(gè)抽象類(lèi)只包含常量和方法的定義,沒(méi)有方法的實(shí)現(xiàn)和變量。
2.接口里面封裝了很多方法,當(dāng)一個(gè)類(lèi)要實(shí)現(xiàn)一個(gè)接口,重寫(xiě)情況有兩種:一.子類(lèi)是抽象類(lèi),有選擇地重寫(xiě)接口里面的方法;二.子類(lèi)是非抽象類(lèi),必須全部重寫(xiě)。
3.一個(gè)類(lèi)可以繼承多個(gè)接口,但是只能繼承一個(gè)抽象類(lèi)。類(lèi)和接口沒(méi)有必然聯(lián)系。
4.抽象類(lèi)能夠定義非 static final 的屬性(field),而接口不能。接口的屬性都是static final的。抽象類(lèi)能夠定義非public方法,而接口不能。接口的方法默認(rèn)都是public的,因此繼承接口的類(lèi)的方法權(quán)限不能比public小(即只能是public)
接口中的方法默認(rèn)為public abstract,屬性默認(rèn)為public static final。接口中的方法不能有實(shí)現(xiàn),Java中類(lèi)只支持單繼承,而接口可以支持多繼承。