00:00
来,那咱们继续再往下吧,再往下啊,那再往下的话,咱们从这一块儿呢,点击右建,我们新建一个,我们叫over什么呀,Overweight test02.java啊。嗯。那什么时候我们会考虑使用方法覆盖呢?哎,当什么呀,子类,当这个子类继承父类之后。当继承过来的。方法无法满足当前此类的业务需求时。啊,此类有权利。对。这个方法进行重新编写。啊,有必要进行什么呀,方法的覆盖。
01:04
方法覆盖又叫做什么呢?方法重写啊,方法覆盖叫做方法重写。英语单词叫做,叫做什么呢?有的人把它叫做override,有的叫做over。都可以都可以啊,你看方法。叫做覆盖是吧,哎,方法重写,然后呢,Override或者是overri啊这个比较常见的。就是方法覆盖。方法重写。Over啊,这样写各位啊,一般都是这样的over over啊这是over,这个就一般很少说了啊,一般很少说了,那么我们可以在这里回顾一下方法重载各位什么时候。
02:11
考虑使用方法重载啊。嗯,还记得吗?方法重载叫overload。当在一个类当中,如果功能怎么着相似的话,建议将名字定义的。一样啊,这样代码美观,并且方便什么呀编程。是不是,哎,那么什么条件满足之后。啊,能够构成方法重载overload呢?条件一来回顾一下各位啊,方法重在这块,条件一是什么呢?是在同一个类当中,条件二是什么呀。
03:12
条件二是方法名相同,条件三是什么呀?是参数列表怎么着啊?不同个数不同算不同,顺序不同算不同,类型不同也算不同啊,什么条件满足之后能够构成方法重载?Overload啊,同一个类当中,方法名相同,参数里边不同。啊,这是方法的一个重载,各位啊,这是方法重载。好,这是一个回顾,各位别别混了啊,一个叫什么呀?叫overwe,一个叫overload overload是方法重载,然后overwe是方法重写,一个叫重写,重新编写嘛,重写其实就是重新编写啊,就是重新编写,就这意思叫重写嘛。
04:02
哎,好,那么接下来我们来看看啊,就是我们刚才这个程序。Public。我这回顾的目的就是别混了,各位你你自己对照一下啊,别混了,Public class,我们叫over b test02public。Static voidman。好了,我们在这儿呢,有一个class啊,我们叫animal,那这个动物呢,我们里边有一个方法,这个方法呢,我们还是叫move吧,system.out system.out.print打印输出,输出什么呢?我们叫做动物在移动,动物在移动,然后接下来我们加一个class,然后呢,Extend继行animal,然后接下来我们在这里呢,Public我们重写啊。重写,重写对谁呀?对move方法进行重写。对move方法进行方法覆盖,方法重写啊,Overwe,那么这个时候最好呢?最好啊,最好将负类中的方法。
05:15
原封不动的复制过来啊,不建议。手动编写啊,一会儿你就知道了,为什么复制啊,来复制一下,拿过来放到这儿,然后接下来把这个方法里面的实现,你可以改成其他的逻辑,比如说你可以说出一句话叫鸟儿在什么呀?鸟儿在飞翔。那么这个时候如果我在这里这样吧,我再来一个把我刚才程序都改一下啊,叫做cat去继承谁啊animal,那么接下来我这块呢,Public void move,你看我手写了就不太好从这怎么着,把它复制一下,别动啊,粘贴贴过来之后在这呢,system.out.print line打印输出啊,那叫比如说猫在走猫,那么这个时候呢,就相当于我们这个重写了,这个也进行什么呀,方法重写。
06:17
那么子类继承了父类之后,将方法重新写了一遍之后,我们在这里再去创建,比如说叫做bird b。New一个bird出来完之后呢,接下来B点什么呀,Move。Bird吗?它有move方法呀,是不是,那么接下来在这个地方有个什么呀,叫做KC等于new一个K,那么接下来在这呢,C点什么呀,Move是不是?哎,我们去调木方法,我们再去编译Java c呢,我们去编译我们的一个叫做over read over read test02.java编译之后加了运行over read test02,好,大家看这个程序啊,这个子类继承父类之后,如果我现在对你父类的方法不满意,我子类呢,把这个方法重写了。
07:10
是不是,哎,我重写了啊,那我重写之后,我将来在调用我这个方法的话,是执行我父类的方法还是执行我子类的方法呢?来我们一起看一下这个猜应该能猜出来,肯定是方法重写嘛,对不对,重写之后肯定是调子类的,就不再调父类的了,就是你现在这个目方法不是被继承过来了吗?对吧,哎,继承过来之后,我在这重写了,如果你这啥也没有,那你调的肯定是这个,如果你说子类里边写了一个同名方法一模一样。驼了,那这个时候钓谁呢?我们来看一下,好大看鸟儿在飞翔和猫仔走猫步,猫在走猫步是不是?所以呢,这里呢,有个很重要的一个结论,各位。重要结论啊。这个重要结论是什么呢?也也不能说叫就近原则啊,不能说叫就近原则,其实大家想一想,我上节课讲的时候,是不是此类去继承父类之后,会把代码复制一份过来,对吧?
08:08
它实际上啊,这个代码已经复制过来了,在这个大框里边是有一份的啊,有一份一模一样的代码在这里边啊,他又重新写了一下,明白吧,但是在程序里边,他对他进行标记。他对这个方法进行了标记啊,标记了什么呢?这个方法是从负类里边继承过来的,而这个方法是是我们程序员自己重新又写的,他会选择这个方法去执行,不会执行这个啊,其实跟就近原则没什么关系啊,不要往就近原则上想,你就记方法重写就行,重写方法,重写方法覆盖就要覆盖啊,其实这个你自己写了之后,就把原先这个覆盖掉了,原先那就不复存在了,就这意思。啊。方法覆盖方法覆盖就是将继承过来的那个方法给覆盖掉了。继承过来的方法没了啊,继承过来的方法没了,就这意思。
09:03
啊。好了,那么这块的重要结论是什么呢?就是当什么呀,当此类对对什么对父类继承过来的方法进行方法覆盖之后,子类对象调用该方法的时候,一定执行重写之后的方法,覆盖之后的方法。注意啊,有个重要结论啊,当此类对父类继承过来的方法进行方法覆盖之后,子类对象调用该方法的时候,一定执行覆盖之后的方法,之前的方法就不执行了,就不执行了啊,我们再来编译,再来运行,好来看鸟儿在飞翔,猫在走猫步,如果说你现在把下面的这个方法说鸟儿在飞翔这块给它注释掉了,那么对不起,您这块呢,这个方法就等于是没有方法覆盖,你仍然是子类继承父类的时候,会把父类的方法拿过来放到这儿,这里会有会有一段代码偏段,你在执行的时候还是在动物在移动啊,编译在运行,你看动物在移动是不是?哎,那如果说你把这个放开,那妥了,对吧?哎,我们再来编译一下,我们再来运行一下,你看。
10:17
是吧,鸟儿在飞翔,猫在走猫步啊,所以方法覆盖其实还是很简单的啊,很简单的。嗯。不难各位啊,不难,你看很好理解是不是啊,因为我们在现实生活当中确实也有这种情况,你说我此类现在继继承你父类了,是继承过来了,但是你这个方法不够用啊,你这个方法已经跟跟我脱节了,我可能移动的时候是是是是在飞翔,对吧,我可能移动是猫在走猫步对吧?但你你你这边是动物在移动,那可能不满足我的业务需求,我对于你这个方法,我就要进行方法的覆盖,进行方法的重写,我进行呢。是不是好,那么刚才上午呢,我们上边呢,我们就说了很多是吧,什么时候我们会考虑使用方法方法覆盖呢,对吧?哎,在这解释了一下啊,方案覆盖是什么东西,解释解释重要结论也说了一下,那么还有一个问题就是当我们代码上怎么编写的时候。
11:10
就是注意啊。当我们代码怎么编写的时候,在代码级别上构成了方法覆盖呢?这个你会有多少个条件呢?那你上面这个说白了就属于重载,我可以把这个东西。重载给他拿一下啊。放到哪呢?放在这儿排个顺序重载啊,我在这儿画一条线行不行,上边是方法重载。下边开始就是方法覆盖,什么时候考虑使用方法覆盖说了满不满足当前这个这个负类中继承过来这个方法不满足我当前此类的业务需求,我需要重写或者是覆盖,那在代码上你是怎么描述,就是在代码上怎么编写,在代码级别上构成了方法的覆盖呢?
12:05
条件一是什么?条件一是什么?条件一是两个类必须要有什么继承关系。明白吗?条件一啊。两个类必须要有继承关系,你没有继承关系是没有方法覆盖这一说的。所以大家还记不记得我之前所说的是继承有什么用?继承有什么用?基本作用和重要作用还记得吧,基本作用是什么?代码复用,重要作用是什么?有了继承才有了方法的覆盖和什么多肽机制是不是?哎,所以说这块呢,咱们两个类必须要有继承关系,这是我们的一个条件啊,非常重要的条件啊,来。
13:01
那么条件二是什么?重写之后的方法必须和被重写的方法一模一样,具有相同的返回值类型。具有相同的方法名,具有相同的参数列表。啊具有相同的形式参数列表,注意啊来条件二重写之后的方法和。之前的方法具有。相同的返回值类型。相同的方法。相同的形式参数列表。只要你是说有父子关系,并且说我这个方法和你复类中的方法的反馈值类型一样,方法名相同,参数列表一样,OK了,我就代表发生了重啊,不是,呃,错了啊,发生了方法的重写,方法的覆盖啊,方法的覆盖。
14:15
一定是是这样的各位啊,是这样的,你比如说在这里呢,有一个方法,呃,Public word thing thing啊唱歌是不是,哎,这里有个参数啊,参数int I有个参数啊,随便写的点out打印输出,我们叫animal thing。我要输出一个啊,叫animal thing。好,那么接下来大家想啊,我在这里啊,我写了一个方法叫public void thing,然后接下来我们在这块system加out.print line打印,我们输出叫thing啊,Bird bird thing啊好,那现在我问大家一个问题,如果说我现在。大家现在思考一下啊,我这个thing和这个thing有没有构成方法覆盖。
15:04
分析这个thing。和负类中的thing I有没有构成方法覆盖呢?有没有各种方法覆盖啊?哎,我们来尝试一下啊,现在bird b吗?B干啥呀?调用呗,是不是调用animal啊,我们就调用。你调这个thing里边传一个什么呀,Int参数。行吧,调这个thing啊,里边传一个100啊,1000吧,好,我们来看看它会不会输出这个地方的bird thing,还是输出animal thing,好吧,就是你这个animal里边有个thing方法,有一个int参数,我这个bird里边也有一个thing方法,但是没有in参数,我在这里调的什么呀?调的是b.C然后里边传个1000,调的是这个方法,那么如果说你这个方法要是对我这个方法产生了覆盖或者是重写,那么大家想一想,是不是应该调用此类里边重写之后的方法。
16:12
那我们来看看这个输出结果是什么来。Java c呢,去编译Java去运行,好大家看叫thing,好,你从这儿可以得出一个结论,在这个位置输出的一个结果是animal thing,也就是说调的方法实际上是这个方法对不对,那和这个方法是不是没有任何关系啊,是不是和这个方法是不是没有任何关系啊,所以说有没有各种方法重覆盖呢?没有啊,没有原因是什么原因是。这两个方法根本不是一个,这两个方法根本就是两个完全什么不同的方法啊,不同方法,那可以说这两个方法构成重载吗。可以说这两个方法,这两个方法构成了方法重载吗?这个答案是可以的,因为在这子类呢,去继承什么父类,它会把这个代码复制过来放到我们子类当中,明白吧,也就是说这里呢,实际上是有这个方法的,我们曾经说过,在同一个类当中,我们的方法名如果相同参数列表不同的话,就就就代表构成的方法的重载是不是?哎,所以说这块呢,实际上我们子类去继承父类之后,这个方法在我们子类中也有啊,和我们这个方法构成的方法重载,并没有构成的方法覆盖,各位啊,方法覆盖那方法覆盖,我再强调一下啊,必须是相同的返回值类型。
17:40
啊,相同的。返回值类型相同的方法名和相同的形式参数列表。来。条件三。访问权限不能更低,可以更高,这个先记住啊。
18:09
不同的返回类型可以试一下,没有任何问题啊,没有任何问题,只不过到时候他有父子关系的话,可以看一下啊,我现在我先说的是各位啊。呃,伟斌呢,你可以这样,你自己先测一下啊,就这个返回值类型也不一定说你100%完全相同。如果你具有父子类继承关系的话,就是你上边这个木方法和我下边这个木方法返回的类型,如果有继承关系的话,也是没有任何问题的啊,也是没有任何问题的。但是现在你先不用管这个,你先记一下,就是重写之后的方法和之前的方法具有什么相同的返回值类型,相同的方法名和相同的形式参数列表。继承关系现在讲不了啊,讲不了这个东西,因为这个跟多肽有关系啊,所以你先记这个相同的反式类型,相同的方法名和相同的形式参数列表啊,你就记住一样就行了。
19:06
一样啊,然后再往下的话,就是访问权限不能更低,可以更高,是什么意思呢?比如说我们现在这个方法,这个大家现在只能记住啊来上面这个方法有个move方法有个move是不是,哎,然后这块呢,我们有个public,那如果说我把这个变成这个protect。呃。他这个表是公开的,是不是访问权限是不是更更这个权限,这个开更开放啊是不是,那如果子类去继承负类,如果现在我这个方法不是这样写的。我把这个修饰符这一块,我给它改了低了一些,比如说我给它改成什么呀,低了一些啊,低一些比受保护的吧,叫protected,这个也是个关键字啊。Protect表示受保护的。啊。没有什么呀,开放啊。开放public是公开的啊,我们来编译一下,看会有没有问题。
20:06
好,他说第67行有问题,说bird中的move方法无法覆盖animal中的move方法。正在尝试分配更低的访问权限。以前为public,大家看他说的很详细,是不是正在尝试分配更低的访问权限?以前为public啊,以前为public。所以这块是不行的,各位啊,正在尝试分配更低的权限以前,所以这点你还得注意一下,不行,来这个放开啊。这边呢,咱们放开。那如果说你以前是protected。我现在把它变成公开的public行不行?你看我这怎么说的,我说访问权限不能更低,可以更高。
21:00
我们编译一下好的,没事儿。是不是,哎,没有任何问题啊,没有任何问题,所以这块呢,大家呢,可能现在理解不了,你这个理解不了的话,你呢,先记住就行了,好吧,你先记住啊,先记住,记住什么呢?就是如果如果是访问权限这块的要求的话,你就记住不能更低,但可以更高。就你原先是我不能再低于你public。如果你是原先是protected,我现在可以更高。可以更高啊,你先记住这个解释不了现在啊。还有一个也解释不了的,各位啊,也解释不了的,哪个解释不了呢,就是。重写之后的方法不能。不能比什么呀,之前的方法抛出更多的异常抛出啊,更多的异常。可以更少。妥了,这个方案覆盖就说了啊,说的这个结这个这个叫什么,这个条件啊,就说的差不多了,各位啊,这个也是什么呀,先记住各位啊,讲异常之后,我们这个才能解释。
22:14
重写之后的方法不能比之前的方法抛出更多的异常,什么意思?你比如说现在我在这个地方啊,有一个木录方法,然后呢,我写这个目录方法的时候呢,哎,我是这样做的,注意看了啊,负类不抛异常,我此类尝试在这里抛异常,我在这里throw exception,你这个代码已经看不懂了,各位啊,我只是测试一下各位啊,来我们看行不行。编译一下他说什么?第七十五行看见了吧?说bird中的move方法无法覆盖an中的原因是被覆盖的方法未抛出exception。你看人说的很清楚啊,你第一个错误是因为你第二个错误导致的。第一个错误是因为第二个错误导致的,你就不用管这个啊,所以这块呢,大家注意啊,这样不行。
23:03
原因是什么?原因是被覆盖的方法抛出exception,所以你不行,不能以这种方式。啊,但如果说我们现在负类如果抛出了一场exception对吧,那我此类能不能不抛啊。就可以不跑吗?就说这意思叫什么呀,重启之后的方法不能比之前的方法抛出更多的异常,可以更少你这个抛异常啊,哎,Throws exception,但是我此类重启的时候我不抛行不行,来我们尝试一下这样的C编译一下。没事儿。看见了吧,哎,这个程序没有任何问题,编译通过了,所以说这块呢是可以。更少,但不是不能更多,一共是四条规则,各位先把这四条规则忌会忌会啊,条件一两个类,必须要有继承关系。
24:02
啊,必须要继承关系啊,第二个重写之后方法和重写之前的方法具有相同的反馈类型,相同的方法名,相同的形式参数里边我在这里再重复一下啊,这个反馈值类型你就先继承是一样的。是一样的啊,因为现在我们还没有说多肽啊,所以这块的话先解释不了,你记住三个相同就行了,相同反数类型,相同的方法名,相同的形式,参数列表。三个相同才能构成方法的覆盖啊,方法覆盖前提是两个类具有竞争关系,但是条件三个条件四,大家可能很比较郁闷,郁闷郁闷的不理解啊,这都是死记硬背的,哪块呢?访问权限不能更低。比如说我负类当中是public,如果我此类在这儿使用protected,受保护的,对不起,不行。不能更低,但可以更高是没问题的。可以更高是没问题的啊,然后重启之后方法不能比之前的方法抛出更多的异常,你之前的方法没抛异常,结果你在这个位置,你throws exception抛出异常,对不起,那就不行,但如果说你负类这块抛出异常,我此类能不能不抛,诶这个可以就是可以。
25:14
这个比之前的方法怎么着啊,不能抛出更多的异常,但是可以更少啊,可以更少,行了,关于方法覆盖的四个条件啊,我们就说到这里啊。
我来说两句