00:00
接下来我们再来介绍一下skyla当中的抽象类,那那这个概念其实跟Java当中也是非常类似的啊,就是所谓的abstract class,那我们知道所谓的类它本身就是对于对象的一种抽象,就是一种分门别类啊,把它所有一类型的对象特点要提炼出来。定义这样的一个模板就叫做类啊,那所谓的抽象类呢,那就是在类的基础上进一步去做一个抽象化,相当于是一个类的概括,所以整体来讲,抽象类是一种模糊的不具体的一种类的定义啊,所以在抽象类里边它就会有所谓的抽象属性和抽象方法,那接下来我们还是给大家具体的说一说关于这个抽象类的定义的语法,简单来看的话,抽象类的定义跟Java里边。完全一样,那就是用abstract关键字放在class前边,定义出来的类就是一个抽象类obstract class,然后比方说person,这就说明person是一个抽象类。那么抽象类它有什么什么样的特点呢?啊,那就是在抽象类里边,我们可以去定义抽象属性和抽象方法,那所谓的抽象属性就是只定义出了一个属性,没有初始值。哎,之前我们说过,在盖拉当中所有的变量其实都是需要给负一个初始值的,那在类里边呢,我们定义的属性也必须要有一个初值,就算是空,我们也必须要有一个等于下划线那样一个定义。
01:40
那对于这一个不给初始值,有没有这种用法呢?当然是有的,就只有在抽象类里边可以不给初始值,这个时候属性就是一个抽象属性。啊,那同样抽象方法的定义就是只声明出来这样一个方法,而不给他具体的实现,也就是方法后面我们指的那个方法体,什么东西都没有,只有前面的DEF,然后方法的名称,参数列表和返回值,具体实现啥都没有,这样的话就是抽象方法啊这个其实概念跟Java当中还是非常的接近的,非常像啊,啊,那大家需要注意的就是在一个类里边。
02:23
只要存在了抽象属性和抽象方法,那这个类就必须要定义成抽象类。也就是说,我们平常定义的普通类里边,不可能出现不初始化的属性,也不可能出现不给它具体实现的方法,呃,只要出现这样的抽象属性和方法,一定是抽象类。而另外呢,如果我们定义了一个抽象类abstra class,它里边呢,也不一定非得是所有的属性和方法必须是抽象的,也可以给具体的就是已经有初值的属性和已经实现了的方法,那甚至呢,就是抽象类里边抽象属性,抽象方法可以都没有啊,它就跟一个正常类一样,但是我们把它定义成抽象类也是可以的,但一般我们不这么做啊,就是用抽象类,我们最关键的点就在于想要去定义抽象的属性和方法啊。所以接下来我们就呃在这个。
03:20
具体的实现里边来给大家看一看啊啊,那另外就涉及到一个就是抽象类,既然它方法都没有具体的实现,然后这个对应的属性都没有没有出值,那我们肯定是不能基于它直接去创建对象的,那自然就是要有一个子类,然后实现它里边的这些抽象方法,然后给这个抽象属性做做赋值操作,然后接下来创建这个子类的对象。我们才是一个具体可用的东西,对吧?所以就相当于必须要把它具象化,具体化,然后才可以用,所以这就涉及到了一个抽象类的继承和重写,我们需要去定义一个子类,然后extend一个抽象类,那么如果一个子类继承了抽象类。
04:10
这个子类如果是一个普通类的类型的话,那接下来我们就必须把抽象类里边的所有抽象属性和方法做实现。那如果说要有一些还没有实现出来的话,相当于子类里边也得是一个抽象类了,对吧?啊,所以这是大家跟Java里边一样的啊,需要注意的地方,然后另外就是说,如果我们在子类里边想要去重写一个抽象方法的话,这个时候不需要加override,但是如果说想要去重写非抽象方法的话,就本来抽象类里边已经有实现了,这个时候要重写,那就必须要加上override,之前我们在继承关系里边大家也看到了啊,只要是要做重写就必须要override。另外还有就是子类里边可以调父类的方法,这个时候使用super关键字,然后去调就可以了。另外还有一个是子类对抽象属性进行实现的时候呢,父类的抽象属性其实是可以用哇修饰的,也就是说,呃,我们在这里边就是直接。
05:14
父类里边有一个Y修饰的抽象属性,子类里边呢,直接把它赋值,把它定义出来就可以了,实现出来就可以了。而如果说。子类里边我们要对非抽象属性进行重写的时候,Override的时候,诶,那就是只支持负类的非抽象属性,就只支持value类型,就是Val类型,哎,那这是为什么呢?啊,其实就是说如果要是va类型的话,这不就是一个可变的属性吗?那其实没有必要重写,我们直接给它重新赋值不就完了吗?哎,所以这个其实就是比较简单的一种定义啊,那接下来我们还是在代码里边具体来写一写,大家就知道所有的这些特性到底是怎么用了。我们还是在当前的包下边去新建一个scale的单利对象,Object,现在是TEST09。
06:07
我们主要测试的是abstract us。把它创建出来,然后接下来我们写一个幂方法啊,那同样我们下边是要去定义对应的父子类型的,我们要定义的父类,那应该是一个抽象类啊,关键字abstract bus,我们现在呃,比方说定义一个person person9啊,呃,把它定义成一个抽象类,然后里边呢,那就是我们可以定义非抽象属性,其实所谓非抽象属属性就是我们之前熟悉的这种属性吧,直接定义,然后后面要赋值对吧,我说这里边我们直接给一个person,然接下来还可以定义抽象属性那。
07:12
那么抽象属性的话是比方说我这里边给一个二类型的啊,A是只给声明,不给具体的值。直线就是抽象,同样还可以有非抽象的方法,那非抽象方法的话就是一般的方法吧,比方说我定义一个啊,人可以一诗,具体的话,我们这里就非常简单的,直接打印一句话就完了啊。Line打印person,接下来还可以定义抽象方法啊,Deff,比方说呃,人还有一个睡觉啊,人都要睡觉。
08:00
Lip,那当前我们也是一个unit类型,没有具体的直线的过程,没有具体的方法体,那这就是一个抽象方法啊,所以整体定义还是非常简单的,然后接下来呢,我们就定义。具体的直线子类class我们要定义一个student student9 extend9,大家看到上去继承的话,当前直就报错,为什么呢?因为如果当前的。酒本身是一个普通类的话,那里边它必须所有的东西都是具体的。所以只有在把当前的非所有的抽象属性和抽象方法都具体化之后,都实现之后,他才不会报错对吧?诶,那或者你如果要认为它里边可以有抽象的东西的话,他也加一个abstract,那就不会报错了,哎,这个大家需要知道,那接下来我们就来做一个操作啊,哎,那首先我们要需要实现的是里边的抽象属性和抽象方法,比方说这个age,这是抽象属性吧,那这个定义非常简单啊,直接给它赋一个值不就完了吗?嗯,前一个18。
09:20
B,它的类型A给也可以不给,对吧,当前他还是在报错,因为我们还需要有一个抽象方法的直线,比方说填的这个Z。看直接可以出来,这里面默认是一个override EF sleep,其实这个override呢,可以省略,可以不写啊,就是这个是可选的,这里我们可以直接去把这个做一个打印print,比方说当前我们是student啊,你可以直接写一句student sleep。
10:02
把这个引起来,这是关于抽象属性和抽象方法的实现,实现之后我们看到这里就不会再报错了,直线抽象属性和方法,那另外关于这个非抽象的属性和方法,其实我们这里边也可以去继承下来之后,可以更改它的值,那就涉及到涉及到了重写,比方说像这个name属性以及这里的it方法,那在重写就不叫实现了啊,这个叫重写了,重写非。O像属性和方法在重写的时候必须要加上override关键字,可以看到直接去override内,比方说当前我可以直接给一个student'可以,还可以override当前的这个it方法,比如说我们可以直接把它叫做inline,之前我们写的是person it,现在可以直接写一个student'it都是可以的。大家需要注意的是,如果。
11:14
前面我们的这个非抽象属性定义的是V类型的话,那后边这里。可能会想到我,我在这儿可以去做,可以做这样的一个R类型属性的这样一个重新重新定义吗?重写吗?哎,这里我们可以运行一下看一看啊。大家看到这里直接报错了,尽管在idea里边没有提示,但是我们运行的话,编译器会告诉我们这里边不能直接去override一个可变的一个变量。哎,那所以前面如果说这里还是。还是一个value的话,Al的话。这是没有问题的,我们改回来,现在如果要是直接去运行,尽管我们没有任何代码啊,我们就看一看能不能编译通过,这个是没有问题的,但如果要是改成VAR的话就不行了,所以这个怎么办呢?嗯,大家其实知道啊,如果要是VAR的话,本身不就是可以直接继承下来改的吗?哎,所以在这儿你直接这样改,改掉不完了吗?哎,所以整体来讲所有的这些属性和方法的。
12:26
实现和重写就是这样的一个规则,大家只要练习一下就可以了,另外还有就是哎,呃,当前的这一个it里边,我们也可以去调用负类的,就是比方说这个你抽象类里边已经实现过的那个it方法,那调用的时候呢,使用的是super啊一个关键字,那比方说这里边可以调super.e是完全合法的啊,大家可以看一下,测试一下是否能够编译通过。在上面我们也可以做一个具体的测试,定义一个student等于有一个student,有,然后接下来直接调student的方法和student的lead方法。
13:11
我们可以看一看。输出的,大家看到还有一句person it为什么会输出呢?那是因为我们这儿调用了。Super it啊,所以就会输出person it,然后是student it。这就是关于抽象类以及抽象类里边的抽象属性、抽象方法的一些具体的应用。
我来说两句