00:00
好,那么复写字段的细节呢,我们简单的再看一下,有些地方还是要聊一聊一聊的,第一个首先看第一个细节。首先看第一个细节,DEF只能重写另外一个DEF,这个很好理解,就是我方法呢,要用方法去重写,第以及方法只能重写另外一个方法,这个特别好理解,这第一个原则,第二个原则呢,Val只能重写另外一个Val的属性,或者重写一个不带参数的DF,也就是说在SC里面,他把这个它的这个属性因为对应方法,所以说属性的这个重写,方法重写,在一定程度上它其实是等价的。那你看我这个案例是什么呢?同学们首先看我这段代码。同学们,首先看我这段代码,我这写的一个V只能重写另外一个VL,我在这写了这么一段,你们觉得这段代码有没有问题?
01:00
而且你要告诉我为什么。你要告诉我为什么你看啊。这有一个AAA的一个分类。下面我有一个BDB,这是VAR,这是va,诶,我还override它了。那么。同学们想一想这段代码。肯定他是通不过的,因为刚才我在这下了结论了,但是为什么通不过呢?哎,有同学已经知道了啊,你想啊,我们问大家一个问题,如果他这一段代码真的能够OK。如果他真的OK,如果真的啊,真的他OK了,那就出现一个很可怕的一个。很可怕的一个逻辑上的最可怕的问题什么呢?如果真的OK的话,请同学们思考,那你这个内蒙他是不是会生成一个,它会生成两个方公开方法,一个是内蒙设置的方法,一个是内蒙获取的方法。
02:01
那下面呢,是不是因为你是VV的,是不是它的下面就有只能生成一个get的方法,好,那就出现一个什么情况呢?假如我们有一个bbb的,Bbb的这么一个对象,我们在得对象的时候,我们用的是bbb的一个方法,结果我们在设置的时候呢,用的是他负类的一个方法,这是不是就很有可能造成这种逻辑上的混乱了,所以说他的问题是在这里,同学们我写到这里来。啊,这个地方如果成功的话,它会出现这么一个情况。好,我先把这张代码拿过来给大家写到这儿。好,就说同学们一定要注意它的本质问题,我慢慢点啊,这个我们叫做这个字段的。Field的一个over。Override的一个细节override细节de de,好,名字有点长哈,名字有点长,但是还可以接受来组一个主函数。
03:03
我们来看一看,就那么一张就报错。他说老师没有报错,好没没有报错的话,我们运行一把,看看他报不报错。有些时候在看里面呢,它从语法上没有报错,但是执行的时候,他一定会告诉你有问题来执行一把。单方执行的时候呢,必然的报了错了,而且他告诉你的很清晰的说。Name cannot不可以override一个MU就是可变的一个,为什么呢?解释一下原因。解释一下原因,因为嗯,如果说这个这段代码成立的话呢,这边会生成。它在这个底层,底层会生成两个函数,一个是public name。还有一个我我把这个讲完我们就休息啊,Public的一个name点。的这个Dollar EQ。对不对,肯定,那么如果说这样成立的话,它在底层呢?会他在底层会生成什么呢?它会生成一个public的name,这是不是这个道理,肯定肯定会生成。
04:09
好,这样就是说我这个方法把你的方法给复习了。但是这个方法没没没覆盖好,如果这样的话,我们就出现这样情况了,他编译器他很不喜欢这个行为啊,就说马丁在设计的时候,他肯定也在考虑这样一个问题,比如说我这有个BBD。我这有个BBBBB等于溜了一个bbb。这个没毛病,那么那么我就会在程序员在使用的时候呢,假设他使用这个东西bbb点。Name,笨鱼。假如啊,写了一个。那他这样,其实他是不让你用的啊。他是因为我下面这个这地方他已经。哎,哪写错了。这个。这地方是就应该错是吧,你看他这报的错误看到没有。
05:01
是吧,如果说啊,我们说假如这个,假如这个成功的话,假如这个成功的话,那这个他就说如果这个底语法底层真的能实现啊,假如说真的能实现,那这个地方就会。就会干什么。我写到这里了。啊,假如这个成功了,这边就会相当于调用了。相当于啊,就相当于。相当于调用了。调用了什么呢?调用了我们这个负类的,负类的这个方法。是相当于嘛。因为如果说真的成功了,我假设这个成功我当然要继承成功了,那肯定是可以用的。对不对,那么但是你在读取的时候,比如说你用个print l。你在用的时候,假如你这样用了是bbb点内容,那这个时候呢,就相当于用了纸类的。相当于调用了调用了子类的这个内容方法,那这样子呢,编译器就会出现一个数据不统一,这样。
06:05
这样这样编译器编译就是会出现什么呢?会出现数据的这个设置,数据的设置,数据的设置和数据的获取,数据的获取不一致。啊,有可能你这诶收了过后,结果你发现取的东西取取的不一样。这完全有可能的,假设他语法真的通过了啊,我说假设他真的支持这个写法,那完全就有可能,你设置完了过后,结果你取的是另外一个,真好奇怪,我设了一个hello word,结果一取出来取取出来一个OK。那很可怕的,所以说他直接就在这个底层给你阻止了,不让你这么干。他不让你这么干,明白好,所以说这个我们的第一个细节这个地方就讲完了,紧接着我们再来看第二个,同学们看这段代码,你们觉得代码有没有问题?请问这段代码能不能运行成功?这段代码能不能成功?
07:00
这有一个sa。这一个over v这个可不可以成功。这段代码我告诉大家是OK的,因为你们学完这个方法的重写,你就要你就要去搞清楚它的本质,同学们想一想啊,这段代码override Val s,它的本质是不是它会在B里面会生成一个public类型的。这个S的一个,呃,那个那个就说盖盖的方法,那你是盖的方法的话,是不是我就可可以给你形成一个重写的关系,好,所以说它这个是可以的。也就是说这个地方看起来好像是属性,但是你这个属性居然把父类的一个方法重写了。所以在这方学思开了呢。就跟我们Java有个思路上的转变,好我们来看一下,我这写的很清晰啊,就是VR可以重写一个v Val只能重写一个,这样的输引不能重写好,我把这个刚才还没讲完,这个是错,虽然是错了,我把这个改一下,它就是对的了啊,大家看,如果把这个写成L。
08:10
这段代码运行起来就不会报错。看啊,这段代码就不会报错了,原因就是因为你如果改成这个Val的话,底层只会生成。这一个,而你下面底层生成,那么这个就统一了,好所以说刚才我们说的这个逻辑说过了,我们再把第二题讲一下,我们就休息。好,紧接着呢,我仍然在这里。来一段代码。好老规矩,呃,我我这样啊,呃,因为都在这一块,都在这一块的话呢,我我最好是新建一个文件。哦,把这个送完叫什么呢?叫做scanner scanner的这个field。啊,Field override的一个detail,好零二。
09:02
零二快速的走一下,来写个小案例。走。嗯,代码我粘过来,我就不去写了。啊,代码我粘过来,那么现在呢,我们把它改成三个五个。好,下面呢是五个B。好,这边再来一个,诶好,首先首先看代码,代码呢没有任何的问题,我们先来看看能不能跑起来。走叉叉叉好运行。那么一运行呢,我们发现的代码是no problem no,现在我们来用一下,好,现在呢,我们创建一个啊同学们,我们创建一个bbb的对象。又一个bbb。好,然后呢,我来一个点。好,BB,我们现在来运行一下这个代码BBb.S。Bbb。啊,五个B啊,少了一个5B,现在太厉害了啊,好B第二。
10:05
呃,我们来一个塞出取出来了,那么这个S我们看取出来是什么字呢?好,这个大家应该很清晰的知道了。因为还是动态绑定机制,因为你是B,那这反回来就是它这个地方就直接相当于调用这个子类里面的一个sir,也就它会底层里面有一个这个public的。啊,Public的这个好,这个地方应该返回的是零运行一下吧。运营小。好同学可以可以看到返回的是零,那么同学们注意,假如我这样写了呢?好同学们看啊,比如说我还有一个B2,我把它指定为A。然后呢,仍然是六一个bbb。啊,注意同学们注意听,那现在呢,我再调用一下这个B2b2.s等于好,我们照样走一下B2.3。好,那么这个时候返回什么呢?
11:04
这样反问什么大家大家知道吗。哎,不要忘了,我们这个方法是不是有动态绑定机制啊,所以然你这写的AA,它其实调用的是谁,是不是还所以说应该反馈什么,是不是还是十,还是这个零呢?哎,所以说你看现在大家就明白,其实就是零。现在你再看这代码,你突然发现是吧,好像好,如果我不这样讲的话,你肯定是容易懵的嘛,现在我这样一讲,哦,原来这个地方底层就有public,你这方是有个public,但是我重启你了。而且呢,我在运行的时候仍然使用了动态绑定机制,所以说仍然返回的是零。好,我们看这结果我们看应该是返回两个里没毛病,好这个地方呢,这个小细节我们就说完了。啊,两个原因,我不但说了不能这样用,而且我说了为什么不能这么用。对吧,因为这里面大家一定要在要一定要去考虑是看到底层的他的那个那一一个机制,好,我先把这个细节给同学们板书一下啊,同学们好,复写字段的一个逻辑。
12:10
OK,那现在呢,我把它进行一个快速的板书。没问题啊,这个是诗刊了,复写字段的,诶诶呃,就写到这了,复写怎么是抽象内容还没写到这来。哎,怎么搬搬到这儿啊,这不是这个。这抽象类是怎么出来的呀?啊,这复写字段的注意事项,好,来一个小的标题。箭头。不对,好念头。那么我写了第一个案例,第一个需要同学们注意的DF。第二个VL。可以复习的是属性,或者是重写不带参数的DF,那么这里面呢,我们把这个代码给同学们放到这里来,大家去体验一下啊,体验一下这个它的一个使用啊,那我写了两个案例,第一个案例呢是他。
13:03
啊,这个案例呢,我们描述了一个就是细节啊,这么说明是细节是哪里呢,就是。这地方是啊,就是V。啊,先把这个放到这。啊,第一个案例一案例一,这个案例一我们说明什么呢?说明了这个。说明了V。V。只能。只能重写。另外。另外一个V的属性,就是说你你这个属性必须是这个,如果你写成这个就不行啊,要写成那个word的,那就跑不起来。那么这个案例呢?先给同学们板述到这里。好,这是第一个案例。这是第一个案例,大家注意看这一版,改成这个就会报错,我写到这啊。这个地方这个代码是错的啊,运行会错。运行错误。
14:01
啊,如果啊,如果这个va改成。改成这个哇,就报错了。啊,报错了。好。这是第一个细节,那么案例二呢,案例二案例二案例二呢,我们讲了一个什么东西呢?诶案例二我们这讲了一个这样的这样的东西就是呃,可以重写一个不带参数的,注意啊,前提是不带参数的,带了参数那就不是重写了。那么带了参数,它大家想它会做成一个什么形式,就继承下来了,就是方法的重载了,好这样大家注意一个细节,那么我们在这再多说一句啊,那这个案例二是不带参数的DF,那现在我把这个案例给大家再放到这来。好,那现在呢,我把这个代码给同学们板书到这。好。好的。好,放到这里来,OK,注意啊,前提是这里啊,我这写了不带参数的DF,那你如果带的参数会出现一个什么情况呢?同学们想一想。
15:05
如果我这样改了啊,同学们。如果我在这个地方把这个DEF,我就随便写了一个值,假如啊,我这写一个值,它会会出现一个什么情况,大家看啊,我写一个,比如随便写一个string。S。那你这个地方是不是这个重写,就不存在这个重写的概念了。因为你你跟他不不代表这个重写了吗?那你这个值有什么意义呢?是写的这个是不是就跟你就说你这个塞跟我这个塞没有重写的关系了,是这意思吧,哎,这个大家要理解哈,要去理解,那么这个大家应该很清晰的知道这个这个逻辑了,好同学们看这也对应的就报错了,好对应的就报错了,好这个逻辑大家要去理解,因为你负类是这个有有有参数的啊好建议大家去理解一下,就是一定是复习的是这个东西。好了,我们截取一段视频。
我来说两句