00:00
大家好,我是海波老师,咱们前面讲了farm的重写啊,为了让大家加深印象呢,我们这里给大家问几个小问题,让大家回答一下,我们这里呢,来拷贝一下下划线,写个一点击OK,然后呢,把这里我们改一下啊来,然后把这个呢我们去掉好了,去掉以后呢,我们把这个呢,我们也给它去掉就可以了啊行,那么咱们前面给大家讲过了方法的重写啊,就是我们的子类来重写父类的方法,那么为什么要重写呢?就很简单,因为父类的方法呀,它具有通用性,它要保证每个子类都能够继承过去来使用,但是呢,在特定场合下,你这个方法就不适用了,对不对,因为每个子类都会有自己的特殊情况嘛,在特殊情况下,我们子类就需要重写这个方法的逻辑来完成自己的操作,对不对?诶我们就讲过这个事情,那么我们重写需要注意哪些地方呢?我们说了第一个返回值类型,方法名称以及我们的参数列表,我们应该完全相同吧,还有那个权限和那个错误的问题,我们说了咱们后面再提,所以我们这里呢,先不管它。
01:00
啊,我们接下来给大家演示一些例子,让大家体会体会这个方法重写到底是什么意思啊,我们这里呢,给大家写上一个class,我们写上一个CCC,写上一个大括号,然后呢,我再写上一个class,我写上一个ddd,然后呢,放过来,放过来以后我把这个ddd呢,我们来继承咱们的CCC,我这个起名呢,是希望大家好理解,就简单了一点,然后呢,接下来干嘛呢?我们的这个C啊,我们里面给它写一个变量,咱们叫做int I,它等于十,就这么简单,然后呢,我再写个方法,咱们叫做VO,我写个some求和,然后呢,干嘛呢,我把咱们的这个I啊,给它加上十,给它返回一下,就这么简单呀,咱们写上它,那么由于啊,你写个return之后,你这个word就不能用了,我需要给它一个int,就是这个意思。那我写完了以后,同学们我原封不动把这个代码呢,我拷贝到当前的位置,我把它都改成20,然后呢,把它改成20,诶就是这样好了,同学们还记得吗?我们C里面有一个我们的属性吧,我的D里面有一个一模一样的属性,我们讲过了还记得吗?诶,他们俩要区分是可以通过那个this和super区分的吧,然后呢,我这个萨呢是一个方法,我的子类当中是不是也有一个方法呀?
02:14
如果它也有一个方法的话,那么这就意味着这个就算方法的重写吧,什么意思?返回值类型相同,方法名称相同,我们的参数列表也相同,但是里面的逻辑它是不一样的,对不对?哎,这就叫方法的重写了,好了,没有问题,既然没有问题,咱们来演示演示,我们写上,我们叫做CCCCCC,它等于new,咱们CCC好了。写完了之后,那现在呢,我们CCC点咱们叫求和呀,你求和以后都有结果呀,所以来我们运行一下,运行以后同学们我们的结果是什么呢?大家想一想,我们当前答案的结果是什么?我们这里有十呀,有20呀,有加十,有加20,诶结果是什么呢?我相信啊,这个问题对于大家来讲应该不难,为什么?因为这里没有用到D呀,你没有用到D的情况下,不就全都是C吗?所以呢,我们的结果应该是我们的十加上十,是不是应该是20呀,所以我们这里运行。
03:13
运行以后看结果,诶结果呢,应该就是20,我相信这个应该没有问题啊啊,那我接下来呢,把咱们的这个给它注掉好了,我写上什么东西呢?我写上叫ddd,它等于ddd,然后等于new d DD啥意思啊,我创建一个子类的对象,然后呢,调用子类对象中的sum,就意味着我调用这个sum。那么大家想想,我当前的执行结果是什么?我相信大家应该也能判断出来,为什么,因为你当前的这个C没看见呢?那所以我不就是找这块吗?我找这一块的话,我的I是20 20加20,它的结果应该是多少啊?同学们想一想很简单吗?那不就40吗?所以我运行一下看结果,那结果不就应该是我们的事实吗?你看这都没问题,同学们,这个其实并不是我想问同学们的,因为按照咱们之前所学的基本理论的话,这个我相信大家都能得到正确的结果,但是我想问同学们的是,如果我们采用这种方式呢,把这个做掉。
04:16
做掉以后把它改成CC,你们觉得结果是什么?大家想一想,我们当前的操作过程当中,我们用的是多肽的方式,这就意味着我们当前我们有C,我们有D,那好,我调方法的时候,它调的是这个方法呢,还是这个方法呢?对不对?同学们,这个有的同学可能就会有疑问了,哦,老师你前面不讲了吗?我们到底能用哪一个方法,不是取决于我们的引用变量的类型而不是对象吗?那我就明白了,你这里不是C吗?对不对?如果你是C的情况下,那么你C里面的上不就是它吗?那所以我们的I加十,那么不就应该是我们的十加上十吗?所以它的结果应该是20,同学们,我这么分析对不对呢?
05:02
我们前面确实讲过这么回事儿,这个sum方法能不能用,取决于我们当前的这个变量的类型,没错吧,诶,那就是20呀,好,我们运行运行以后你会发现我们当前的结果其实并不是20,是事十,诶老师呢,跟你前面讲的不一样了,那这又是为什么呢?其实啊,我们前面讲的是没有问题的,我们再说一遍,就是说一个对象它能使用什么方法。它取决于引用变量的类型。这个咱们前面确实给大家讲过了,诶没有任何问题,但是大家想想这句话是什么意思,叫能使用,就是说有那么多的方法,哪个能让你用啊,诶我们是个some,他就能用对不对,我们说的是这么回事,但是我没有说他怎么用吧。就是你能用,但是你怎么用就跟这个没有关系了吧,所以咱们接着补充一下,就是说当我的方法能用了以后,那么这个方法来一个对象的方法,它具体的使用,它是需要看具体的对象的。
06:08
什么意思啊,你到底能不能用取决于它,但是你怎么用就取决于它了,所以呢,在这个时候他看的不是这个sum,他其实看的是我们当前的什么D当中的sum,这个大家能不能明白,所以啊,把这两个东西需要大家注意一下啊,咱们再说一遍啊,一个我们的对象它能用什么方法,取决于我们的引用变量的类型,但是这个方法怎么用取决于它具体的对象,所以我们的这个地方走的就是上,所以它是我们的结果,事实这也是对的,诶老师啊,那如果咱们的这个D里面没这个方法怎么办?你不说了吗?我们方法的具体使用取决于咱们具体的对象啊,那你这里没有这个方法,会不会报错呢?我们说他不会的,因为你的这个方法被我继承到了,对不对?那么这个时候大家想一想,我们当前的这个结果应该是多少呢?我相信同学们一想就能想明白,我们这个D对象有个20,然后呢?
07:08
我没有sum方法,我去走sum方法,那么我的I的20不就走到了它吗?那么return I加十不就是20加十,那不就是30嘛,对不对?所以呢,我们这里运行一下,看结果,运行之后大家就会发现我们这里不是30,它还是20,诶老师这又不对了呀,你刚才不说了吗?我们方法的具体的使用是看我们的对象是什么,可是你这里没有所谓的方法,那我就找复类的方法呗。可是我的爱是20,为什么他没用上呢?他如果用上的话不就是30吗?那这里咱们就要说一下了,咱们上面的这句话呀,对于属性也是起作用的,一个对象能使用什么属性,它也是取决于引用变量的类型,也就意味着我们的属性改一下。它取决于引用变量的类型,下面这句话呢,对于属性是不适用的,一个对象的属性具体的使用呢,它是不需要看具体的对象的,什么意思啊,就是属性在哪里声明。
08:07
在哪里使用?什么意思啊,大家看一下我这个方法,我这个方法我的爱你不就在这个CCCC里面声明的吗?那你怎么可能在子类中声明呢?你的这个类都可能没有子类啊,那你怎么可以说在运行的时候我去取子类的I呢?不可能啊,所以这个I在哪里声明,它就在哪里使用,我们的声明就是十呀,十加十,那不就是20吗?对不对?我相信这个大家是能明白的,诶老师,那又不对了呀,你刚才的这个地方你不是这么写的吗?那凭什么我这这个爱就是他呢?因为我当前的这个C里面的I它也有啊,我们这儿为什么就不是我们的30呢?很简单,因为咱们前面讲过了,我们如果有两个I的话,默认情况下它使用的是不是叫this.i呀,对不对?哎,所以当时为什么是我们的20加20等于40呢?因为有这样的一个关键字存在,你写和不写是一回事,所以啊,同学们,我们当前就是我重写方法需要注意的地方,好了,为了让同学们理解的更加深刻一些,我再把这个程序我再改一改,我怎么改呢?我这么写,我写上一个叫int,我叫get I。
09:20
好了,然后呢,我I行了,然后呢,把这个地方改一下叫get I放过来。放过来以后,我放到这里对不对,然后呢,我把这个方法呢,我原封不动,我放到这里给它替换一下,这个住掉啊住掉,然后呢,把它放到这里,同学们想一想,如果是我当前的程序的话,结果应该是多少,把咱们前面这个理解一下,那我们再说一遍啊,一个对象能使用什么方法,它取决于引用变量的类型,一个对象能使用什么属性,它也取决于引用变量的类型,一个对象的方法具体的使用是需要看具体对象的,一个对象的属性的具体使用是不需要看具体对象的,在哪里声明在哪里使用,那好,咱们回过头来,我这个叫get方法是不是也是重写呀,我的这个I是不是也声明在了不同的类当中啊。
10:13
诶,那我现在如果再去执行这个sum的话,结果是多少呢?这个我相信啊,大家想一想应该能够得到结果啊,但是也可能会理解有问题,所以我们这里再给大家解释一下来,咱们看一看,首先啊,咱们这里说一下我们当前的这个萨呀,在咱们当前的C里面是存在的,但是在我D里面是不存在的,所以呢,我们调用这个萨的时候,最终是一定要走到这儿来的。那么如果走到这儿来的话,同学们这个有个叫get肽,记住了它也是一个方法,而这个方法是要看具体的对象的同学们,你们能不能明白这句话的含义,一个对象方法的具体使用,这个使用不是说你直接调用才算,我们间接调用它也算,所以我这里加上一个括号。咱们叫直接或间接它都算呀,那么既然直接和间接都算的话,所以这个方法它也要看具体的对象,诶具体的对象不就是D吗?那所以我们的get I呢,在这个地方象就会有一个方法,而这个方法呢,它里面返回了一个I,这个I是多少呢?A20 20加十,那么结果是不是一定是30呀,所以我们运行一下看结果,那么这时候你会发现结果一定就是30,同学们,这个有点难度,需要大家自己下来想一想,所以方法的重写啊,需要大家自己多多练习,去慢慢体会啊。好了,我们重写的小练习就说到这里。
我来说两句