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,那么就意味着这个产出的又是人又是狗,这很显然是不可以的。但是我们却可以吃午饭和吃晚饭,这并不冲突。所以接口是允许被多继承的。当然接口也可以继承接口,我在吃午饭的接口里还可以调用用勺子吃的接口。

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