上次說到了轉載文章中接口和抽象類的區別。
接下來繼續對每一條內容進行解釋,方便自己的理解。
4. 接口裏定義的變量只能是公共的靜態的常量,抽象類中的變量是普通變量。
在這裏指的是在Java中 接口中只能包含public、static、final類型的成員變量和public、abstract類型的成員方法。
抽象類中的抽象方法的訪問類型可以是public,protected
抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,並且默認即爲public static final類型。
參考文章:https://blog.csdn.net/x1r2p3/article/details/12871989
5、抽象類裏的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那麼該子類只能是抽象類。同樣,一個實現接口的時候,如不能全部實現接口方法,那麼該類也只能爲抽象類。
在這裏抽象類和接口都是一樣的,當我們要去繼承抽象類或者調用接口的時候,如果我們不能實現抽象類內和接口內的所有方法,那麼默認這個類也是一個新的抽象類,用Human舉例子,如果一個類繼承了人的屬性和方法到最後實現出來卻不能吃喝,那他就不可以稱之爲人。而是一個全新的某物=。=. 接口也是如此。
6、抽象方法只能申明,不能實現,接口是設計的結果 ,抽象類是重構的結果
繼續用人來舉例子,要繼承一個人的抽象類,爲人賦予屬性後我們纔可以定義如何去吃喝。吃喝本就是這個模板自帶的,我們只是要把他重新去構建,但本質還是吃喝。但在接口上,給與我們eatdinner的方法,如何去設計怎麼吃,都不會影響到這個人的本質。
7、抽象類裏可以沒有抽象方法
abstract class Human(var name:String)
{
}
在這裏只是賦予了這個人名字,沒有賦予其他的動作,但不妨礙他是人。在後面我們再去細節化這個人可以在子類中fun
8、如果一個類裏有抽象方法,那麼這個類只能是抽象類
要麼實現,要麼抽象。
9、抽象方法要被實現,所以不能是靜態的,也不能是私有的。
抽象方法本身就無法進行實例化,也就是說不能直接去進行調用。那麼如果我們將其私有,那麼在類中也看不到。它的存在就沒有意義了。如果定義爲staic的,那麼就違背了abstract的原本意思:爲了實現多態而允許對方法進行覆寫。靜態的方法是無法被覆寫的。
10、接口可繼承接口,並可多繼承接口,但類只能單根繼承。
abstract class human()
{
abstract eat()
abstract drink()
}
abstract class dog()
{
abstract eat1()
abstract drink1()
}
interface eatdinner
{
fun eatdinner()
{
println("eeee")
}
}
interface eatlunch
{
fun eatlunch()
{
println("eeee")
}
}
以下是錯誤的,不能同時繼承兩個抽象類,會報錯。
class Man:dog(), human() {
override fun eat() {}
override fun drink(){}
override fun eat1(){}
override fun drink1(){}
}
但是可以同時繼承多個接口
class Man:human(), eatdinner,eatlunch {
override fun eat() {}
override fun drink(){}
override fun eatdinner(){}
override fun eatlunch(){}
}
上面定義了兩個抽象類和兩個接口,如果我們在test中同時繼承了human1和human,那麼就意味着這個產出的又是人又是狗,這很顯然是不可以的。但是我們卻可以吃午飯和吃晚飯,這並不衝突。所以接口是允許被多繼承的。當然接口也可以繼承接口,我在吃午飯的接口裏還可以調用用勺子吃的接口。