00:00
我们已经学习了scla当中面向对象的基本知识,最后呢,我们再来做一些内容的扩展,我们来介绍一下在SC当中怎么样去做类型的检查和转换啊,那其实之前我们都已经讲过了,数据类型的自动类型转换和强制类型转换,那现在我们对于面向对象而言,要判断的往往都是一个对象的引用,那面对一个引用类型怎么样去做类型的检查和转换呢?啊,有对应的专门的方法来做,比如说想要做判断的话,那就调用is instance方法,这里大家需要注意,因为我们还要判断它到底是不是哪种类型,所以后边呢,要加上一个中括号,然后把类型填在里边,这就表示的是判断当前这个对象是不是T这个类型。的实例啊,那同样我们还有一个直接做强转类型强转的一个方法,那就是as instance同样也是这样调用,后边加上中括号,把类型填进去,另外呢,还有一个class of方法,可以直接获取某一个类的类名啊,这几种方法在有时候我们对于这个类型想要做一些判断的时候,都是比较方便的一个调用,那接下来我们就在代码里边做一个具体的测试。
01:29
最后这一部分我们就直接放在一个代码里边,Object s7。今天我们测的都是一些扩展的应用啊,Extent没方法放在这儿啊,首先我们来测一下类型的演个和。转换,比如说呃,这里我们还是student一个student,我们为了方便测试,还是把下边对应的这个父子类型自己单独定出来吧,这就非常的简单,另一个person时期。
02:07
Name类型,然后另外定一个age in类型先放在这里,然后里边我们专门定义一个方法,因为有可能涉及到这个方法的调用,定一个危害八体很简单,里面我们就直接。Hi from。然后加上当前的name就可以了,这是呃,我们加上一个person吧,表示这是在负类里边去调用了一个C方法,然后同样我们可以定义一个子类student。我们把这个叫做student时期。那这里面同样是两个参数,因为我们可以有继承关系,所以就不需要单独定义它的属性了,直接extend person17。
03:10
也要注意把对应的参数要传进去,Name和age有了这两个之后啊,那接下来如果说还要实现一个c hi方法的话,必须就要加一个override关键字了,下面我们就可以写一下I from student,然后加上那那对应的我们也可以有一个自己定义的方法study啊。那具体的实现这个就直接写一句student study就可以了,是我们基本的一个框架,那接下来我们就来给测试一下了,首先定义一个student啊,那大家会想到默认情况下,如果我什么都不写的话,其实类行自动推断得到的就是student啊,我们这里为了让大家清楚,还是把它直接写出来,船目前的name和年龄,ALICE18,接下来,呃,这个比较简单,大家如果看这个直接调study,然后直接调a hi的话。
04:21
那都是没有问题的,而且这里c hi1定调的是student啊,子类的对应的这个方法,这我们都是知道的,对吧?呃,From student Alice,然后接下来呢,我们还有另外一种情况,就是定义一个person,那么这个person类型就是person时期,注意you的时候呢,我们这个时候不要又成person,而是new一个student时期,所以大家知道现在我们其实是把一个子类的对象。不止给了一个负类的引用,哎,所以这个时候如果我们在这儿要去做一个person的调用的话,大家知道that也是调用不了的,那它可以调c hi,那这里边C亥的时候应该调用的是父类的方法还是子类的方法呢?哎,这我们知道最后调的还是子类的方法,多肽嘛,啊,所以这个最后输出的是hi from student Bo,这是之前我们就都已经知道的这个效果啊,那接下来我们就来看一看。
05:28
当前的这个student和person他们的类型到底是什么样的?那首先我们可以用is is instance去做一个具体的判断啊,比方说现在我们直接print line a一下。呃,我们说这个student is,我们先判断它是不是student时期啊,Is student时期。然后后边我们就直接加上,直接调,大家看到is instance of这样一个方法,后面就要加上in要判断的类型C的17好,同样道理。
06:07
我们也可以去判断一下当前它是否是person时期。那同样。我们把这个改一下时期,那同样我们也可以判断person到底是否是。首先,我们先看它是否是person时期。这我们想到应该没有任何问题啊,自时器,另外我们想到可以判断一下它是否是对的时期。好,就是我们这要测试的四种情况,我们来运行一下,看看得到的是什么样的结果。大家看到全部都是出。哎,其实这个也非常好理解,首先student那本身它就是student时期类型嘛,所以当然它第一个is instance of,判断这个肯定是true,然后呢,呃,对于这个student。
07:11
时期本身又是person时期的子类,所以我们判断它是否是person时期的时候得到也是处,这个没有问题,那对于我们这个父类的引用,这里的这个person,判断它是否是person时期,这肯定没有问题,肯定是true,那判断它是否是子类的对象的时候,那大家会发现,呃,你如果要是判断不出来它是此类的对象,那我们怎么能够实现多肽呢?呃,所以自然这里边is instance of s时期判断出来也是处,它实质上就是一个student时期啊,所以大家通过这个可以看得很明显啊,就是最终我们当前的这一个对象到底是什么类型的,那其实这里边is instance of可以判断的很明确,不管当前指向它的引用变量啊,到底是父类的还是子类的。而且子类的对象。
08:04
判断是否是负类的一个类型,那肯定也都是处的,这个是允许的啊,那与之对应的我们也可以额外的再定义一个,我们可以定义一个person,二是person类型,这时我们就不定义student的实例了,我直接定义一个person的实例,比方说CARRY25啊,大家想一下当前的。PERSON2,它是否是是person,这个肯定是没有问题的啊,那它是否是子类的类型呢?杰伦的时期呢?那这个我们就想到了,子类当成父类肯定是可以的,但是父类如果要想当成子类的话。2AN is instance of student时期,那肯定就有问题了啊,没有我们测试这个后面没有改啊,这个有问题的,我们应该把上面这个改过来才是一个完整的测试啊,我们要测的是person底是不是。
09:17
当前的这个对象到底是不是student练习,然后下面这个PERSON2又是不是我们来运行一下。大家看到上面都是处,但是最后是一个false,因为当前的父类的对象不能认为是子类的类型啊,这个大家可以做一个了解啊,然后接下来就涉及到了类型的转换,我们前面这个做的其实都是。类型的判断,接下来我们来做一个类型转换,要做类型转换的话,那要调用的自然就是另外一个方法,所谓的as instance这样一个方法了啊,那当前我们要判断的肯定就是先得判断一下,你得是这样的一个类型,还做这个强制类型转换,对吧?如果连is instance都不是的话,直接你要as instance of去做转换,肯定最后是要报错的,哎,所以这里边我们其实就是比方说前面这里。
10:23
有什么类型呢?哎,这里的person本身我们定义的类型是person时期,但是它指向的对象呢,其实我们看到了它是一个student时期,对吧,所以这里我们可以直接把这个copy过来。如果这个为触的话,那接下来我们就做一个转换,我们可以。呃,定义一个,我们把当前的这一个。对象实例直接转换成一个student的类型啊,所以这里边我们就是直接用person填as instance student时期,这样的话就把它做了一个转换啊,然后我们就可以看一看new student至H,大家看现在就可以调这个study方法了,我们看能不能正常的读出对应的结果。
11:22
运行一下,大家看到完全没有问题,我们当前可以把它转换过来,然后调用当前的student的study方法。另外还有一个是可以看到当前的类的类型,对吧?那这里我们可以直接做一个inline打印,Class of student时期,我们来运行一下,突出的其实就是当前类本身的这个定义,大家看是class chapter06.student时期,这就是关于类型的检测。以及转换的这个过程。
我来说两句