抽象类定义
我们之前说“人会尿尿,男人是站着尿尿,女人是蹲着尿尿”,在基类人(Person)中定义了尿尿的方法(niaoniao),但其实基类人(Person)不知道怎么定义尿尿的行为,站着也不行,蹲着也不是,应该交给子类男人(Man)、子类女人(Woman)具体去定义尿尿行为。
在程序世界里面,基类中某个方法,基类不知道具体实现,需要交给子类去具体实现,我们可以把这个方法定义为抽象方法。那怎么把方法变成抽象方法呢?去掉方法体,方法上加上abstract关键字即可,类似这样:
一个类如果包含了抽象方法,那么这个类需要变成抽象类。那怎么把类变成抽象类呢?类的前面,加上abstract关键字即可,类似这样:
抽象类实现
基本实现
我们把“人会尿尿,男人是站着尿尿,女人是蹲着尿尿”这样的例子,通过抽象类和抽象方法实现一下,参考代码:
针对以上代码只是把niaoniao方法改成了抽象方法,Person类改成了抽象类,其他没有改变。
可包含方法实现
但是抽象类,可包含方法实现,类似这样也是可以的:
我们对上面代码做相应修改,参考代码:
不能被实例化
抽象类不能被实例化,只能作为基类,被其他类所继承。我们通过代码验证下,参考代码:
子类必须实现抽象方法或者变成抽象类
一个类继承了抽象类,要么实现所有的抽象方法,要么再把自身变成抽象类。抽象类可以包含非抽象方法。参考代码:
我们看到Man没有实现niaoniao的方法,就需要通过abstract关键字继续把类变成抽象类。
抽象方法必须public或者protected(默认就是)
抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。参考截图:
可包含属性
抽象类,还可以包含抽象属性,也就是通过**abstract**关键字修饰的属性,如果抽象类中含有抽象属性,子类中必须将抽象属性初始化,除非子类也为抽象类。参考代码:
【代码清单-抽象类6可包含属性_子类必须实现或者变成抽象方法.kt】
属性不可实例化
虽然,抽象类可以包含属性,但是只能包含属性的定义,属性不能实例化,参考截图:
【抽象类7可包含属性_属性不能实例化.kt】
a
网友评论