Java中,我自己定义的某个类,去实现某个接口,是否必须实现该接口的全部抽象方法呢?
不一定,關(guān)鍵要看子類是否是抽象類。
如果子類是非抽象類,則必須實(shí)現(xiàn)接口中的所有方法;如果子類是抽象類,則可以不實(shí)現(xiàn)接口中的所有方法,因?yàn)槌橄箢愔性试S有抽象方法的存在!
一、抽象類定義
抽象類往往用來表征對問題領(lǐng)域進(jìn)行分析、設(shè)計中得出的抽象概念,是對一系列看上去不同,但是本質(zhì)上相同的具體概念的抽象。通常在編程語句中用 abstract 修飾的類是抽象類。在C++中,含有純虛擬函數(shù)的類稱為抽象類,它不能生成對象;在java中,含有抽象方法的類稱為抽象類,同樣不能生成對象。抽象類是不完整的,它只能用作基類。在面向?qū)ο蠓椒ㄖ?#xff0c;抽象類主要用來進(jìn)行類型隱藏和充當(dāng)全局變量的角色。
二、抽象類特點(diǎn)
1)抽象類不能實(shí)例化。
2)抽象類可以包含抽象方法和抽象訪問器。點(diǎn)評:這個抽象訪問器是什么鬼?不就是 setter/getter 方法嗎?
3)不能用 sealed 修飾符修飾抽象類,因?yàn)檫@兩個修飾符的含義是相反的。 采用 sealed 修飾符的類無法繼承,而 abstract 修飾符要求對類進(jìn)行繼承。
4)從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實(shí)際實(shí)現(xiàn)。點(diǎn)評:這個非抽象類應(yīng)該叫具體類
三、與具體類的比較
1)抽象類不能直接實(shí)例化,并且對抽象類使用 new 運(yùn)算符會導(dǎo)致編譯時錯誤。雖然一些變量和值在編譯時的類型可以是抽象的,但是這樣的變量和值必須或者為 null,或者含有對非抽象類的實(shí)例的引用(此非抽象類是從抽象類派生的)。
2)允許(但不要求)抽象類包含抽象成員。
3)抽象類不能被密封。
四、與接口的比較
1)相同點(diǎn)
a、不能實(shí)例化;
b、包含未實(shí)現(xiàn)的方法聲明;
c、派生類必須實(shí)現(xiàn)未實(shí)現(xiàn)的方法,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員)。點(diǎn)評:派生類是指所有派生出來的子類(可以是抽象類,也可以是具體類),所以派生類必須實(shí)現(xiàn)全部的抽象方法的說法是錯誤的。具體的子類才必須實(shí)現(xiàn)全部的抽象方法
2)不同點(diǎn)
a、類可以實(shí)現(xiàn)無限個接口,但僅能從一個抽象(或任何其他類型)類繼承,從抽象類派生的類仍可實(shí)現(xiàn)接口,從而得出接口是用來解決多重繼承問題的。
b、抽象類當(dāng)中可以存在非抽象的方法,可接口不能,且它里面的方法只是一個聲明必須用public來修飾沒有具體實(shí)現(xiàn)的方法。
c、抽象類中的成員變量可以被不同的修飾符來修飾,可接口中的成員變量默認(rèn)的都是靜態(tài)常量(static final)。點(diǎn)評:不是所有的變量都是成員變量,所以這里應(yīng)該表述為變量才正確
d、抽象類是對象的抽象,然而接口是一種行為規(guī)范。
總結(jié)
以上是生活随笔為你收集整理的Java中,我自己定义的某个类,去实现某个接口,是否必须实现该接口的全部抽象方法呢?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嵌入式linux和linux区别(lin
- 下一篇: Java 的面向接口编程