Kotlin自學日記之接口和抽象類的區別(下)

上次說到了轉載文章中接口和抽象類的區別。
接下來繼續對每一條內容進行解釋,方便自己的理解。

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,那麼就意味着這個產出的又是人又是狗,這很顯然是不可以的。但是我們卻可以吃午飯和吃晚飯,這並不衝突。所以接口是允許被多繼承的。當然接口也可以繼承接口,我在吃午飯的接口裏還可以調用用勺子吃的接口。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章