00:00
嗯,刚才呢,呃,讲到这个地方,同学们有所疑惑啊,哪里呢?啊,有同学对这个地方呢,不甚了解哈,我跟大家聊两句。大家聊两句,哪里呢,就是前面这个都没毛病,前面那个都没毛病,我把这个稍微整理一下,这个挡在我这难受。好,哪里呢?就这一个地方,同学们有点感觉有点怪怪的,说,老师,你这个地方是一个protected类型。Protect it,你这写了一个protecting,在子类里可以使用,这是没问题的,我能够接受,就说在子类中,子类中。子类中。使用。Protected这个大家是觉得完全可以接受对吧,那这个肯定的Java里面有什么干的。啊,这个可以接受啊,那么在这里。在这里既然你呢,在子类里面可以使用,而而且呢,而且我们通过这个反编译,我们可以看到,在protect里面呢,它反编译过后,它的的确确是对应个public的,这点大家也能够能够看得到。
01:15
是的确从反编译来说确实是一个public的,那这样的呢,同学们感到就非常的迷茫了,说老师那你。那你说这个地方既然是呃反编译是的public的,那你在同一个在相同的这个包里边,在同一个包里面,我为什么就不能去使用这个TEST200呢,这个讲不通啊,好,同学们注意听这句话啊。同学们要注意一个细节,我在讲,我在讲包的可见性的时候,就是在我们上一次课讲的时候,我曾经说了一句话,当时可能有同学们没有注意这问题,说protect是受保护的权限,SC中受保护的权限比Java更加严格,只能在子子类中访问,同胞无法访问。这个是哪里做的呢?是编译器。
02:08
编译器。它这个编译器在语法层面上就控制你了,也就是说你可以这么理解,虽然你编译完了过后是public,虽然你编译完了过是public,但是你在没有编译之前。语法它禁止你这样使用,这就好比韩老师这个桌子上这有一块大蛋糕,你们可以,你你们是可以吃的,但是我不让你吃,明白吧,就是这样,你你看见你就说你是你是用我们刚才发了一个什么逻辑呢?我们是把一个结果在反推,问你为为为什么要可以用,这个逻辑本身就错的,明白吧,他不不能这样反着推哦,你是看到一个结果你反推他应该用,其实我们应该是先看语法,这个是他从这个编译器的语法层面上禁止你的编译器,它不让你过,不让过。
03:02
好,这个第一点我说到这里,第二点讲到这呢,同学们可能听到这呢,也也有点呃有点迷茫了,说老师那你既然这样的话,你protect有什么意义呢?同学们注意听啊,其实他还是非常有用的,从学到这里我们可以看到,其实SC他的这个他的这个整个这个继承,包括它的可见性呢,变得比较清晰了,他怎么做呢?如果你是没有做这个设置的,那么就是它,它其实如果你前面没有用修饰符,那就意味着你的这些属性和方法可以干什么呢?可以在任何地方使用。好,这是第一个,第二个,如果你的属性和方法加了protect的,那么只能在纸类可以使用,如果你加了private的属性和方法只能在本类或者是半生对象可以使用,这样逻辑就三大类就完了。而把Java里面有一些就是默认呢,还有这个protected啊,还有这个那那个那个private public很多东西就拿掉了,其实他就变成了这么三大三个大块啊,这样子大家应该感觉到更清晰一点了,好,那么我就讲到这儿啊,那就是不管老师怎么讲。
04:18
就是讲的再怎么样,大家可能还是有疑惑,所以说有些时候呢,你就必须要抱这样一个态度了,就是当我理解到一定程度的时候,咱们理解到这个位置,就可以不用再去往里面钻,再往里面钻呢,那就研究的是什么东西了,你们知道吗?就研究编译器的这个语义语法词法分析了,那有一门专门的学科叫编译原理。这个我们没有必要再往里面钻了,好吧,就是讲到这个层面,大家哦,啊知道这个意思可以了,咱理解到这个层面就OK就好,那个九阳神功一共就一共有七重,张无忌也就练到第六重就不念了,再把第七重念完就疯了,你知道吗?啊,所以说我们掌握到一定程度,哎,差不多哎可以了,咱们就重点还是把逻辑放在什么呢?咱们以后写代码重点还是老师说的一个是逻辑上的优化。
05:08
啊,一个是逻辑,就是我们说的业务逻辑的优化,哎,第二个呢。一第二个呢,就是我们性能的优化,诶这个以后才是你们真正啊性能的优化,才是你们将来真正工作的重点。这个才是你们工作对于这个编译最特别底层的,你掌握到一定程度啊,理解到这个程度,诶老师讲到这可以了,反编译都已经看了,差不多就O了,好再往下面这钻了,把你的时间浪费了,不是说不让你们钻研,你再去钻研的话,你你就是专业的语法和词法本身,现在现在现代语言都已经尽量让大家不要去看了,只是老师在讲课的时候呢,没有办法,为了讲的更透一点,会看下代码,其实我相信在未来的这个再过多少年吧,是吧,这个七年八年以后,可能大家越来越看重的是这个语言我怎么用,就好像给你一把刀。
06:01
你就研究这个刀怎么用对吧,不要去再研究这个刀是怎么做出来的。好,当然你要去研究一下也可以,那当然更好啊,就是你能把这个讲的越透越好,呃,但是我们时间在时间上有有选择的时候,还是要注意把重点放在一个适当的位置,好,这是刚才老师给大家做了一点简单的一个说明,同学们我们继续往下学。那么前面我们。前面我们把这一个继承就说了啊,说了说完过后呢,下边我们继续来看重写方法,重写方法呢,也是放在继承这个层面说的,为什么?因为有了继承才产生了重写的概念。说说为什么把重写方法放在继承这个章节,解释一下好了,我们先来看一下何为重写方法,重写,听这个名字嘛,重就是重新写,就是相当于说把它给覆盖了嘛,啊对吧?那么看一下是干什么呢?就说scla明确的规定重写一个非抽象方法需要用override修饰符,注意在Java里面。
07:09
有没有这个明确要修修饰一下呀。不需要吧,不需要,但是在SKY里面需要我们明确的要用这个override来修饰一下,否则要报错。他为什么加了这个东西呢?那说起来就跟他就跟他那个就是那个trade有很大关系了,我们后面再聊到这个啊,这里我说的是非抽象方法需要。如果你重写一个,那如果不是就就是抽象方法,那就不是重写,而是实现了啊,注意这个句子,那么调用超类的方法可以用super关键字,好,那么现在呢,我们快速给大家来一个案例啊,然后呢,我们再说,再再把这个说一下啊,我们看看重写方法的这个知识点。啊,我们快速的过一下,那么重写方法是什么东西呢?来,我们聊两句。我们聊两句,首先,首先我们来看一段代码。
08:04
啊,我们看案例啊,代码索引,我们直接升代码了。那么因为时间的关系呢,这个代码我就直接拿过来用好吧,因为这个并不难,所以说呢,老师就呃,直接给大家拿过来用好,这个叫override。Over。Override重写,那么我们的第一个练习override。好的,那么为了以示区别呢,我们就叫方法的over right,那么就写method。好的,那么写个小案例。好,这个写案例的时候,名字有时候还不是很好取,太多了。好,我在这写一个主函组组的这个方法,然后呢,把这个代码先粘过来,大家看到这里呢,是一个person类,这个对我们来说没有难度,就是person类,然后呢,我紧接着啊,同学们,我写了一个employee。让他继承了person啊,写到这里来这里啊,这里我们继承了,继承了这个person。
09:07
啊,继承这个person好,我们来看一下这个地方呢,我们看这里。嗯,这个地方有个什么问题啊,大家看到他说我无法解析这个函数,遇到这种问题呢,不一定是你代码的问题,而有可能是类名的冲突,所以看到这大家不要着急啊,就要看我这看到头晕眼花没找出来,其实是你的类名可能冲突了,那为了区别这个呢,我换一个名字啊。因为我有可能在做案例的时候,我写了很多类,可能就重名了,你看这没错了,看到没有,如果你为了这个东西浪费你半个小时,你还不如去睡会觉呢,对不对?这地方大家要注意这个细节,好老师呢,就说到这,我们现在看一下它的一个情况,那么我们看到这里啊,同学们,这有一个print name,这个是输出名字对不对。这很简单,嗯,默认是一个public的,那么这里呢,我用一个override,如果我不写这个,它会直接报错。
10:09
哦,因为现在是个快速入门,你看看你直接写一个print内容,他直接告诉你了啊,Method print needs override body,就是需要一个override的一个修饰符,那就意味着如果我们的子类注意听我们的一个子类拥有了跟父类相同的名称,那这个时候呢,咱们就需要给它加个override,明确说明我是要重写这个方法。啊很简单,那么大家看这里这里这个地方呢,呃,因为你一旦重写了,呃重写了,那么我们要想去使用父类的一个方法,我们还是跟Java一样,这点跟Java一样,用super关键字去调用啊,如果在子类中。在子类中需要需要去调用父类的,父类的方法,覆类的方法啊啊当然呃指的是呃覆盖这个方法,如果你没有覆盖,那你不需要加super,相当于是继承下来的嘛,对吧?啊如果调用覆列方法,呃明确啊需要明确的需要。
11:14
去调调用复列方法,使用什么呢?使用super关键字,使用super啊super关键字我再说一遍啊,是在重写的时候需要,如果你这是一个普通的方法,比如说Co哈生亥。那这个时候你因为是计水下来的,那你不需要写那个啊,你要也一样调用,那为什么这要加super呢?因为你不加super就相当于是递归调用自己了,那就那就没有调到负类的,因为你在本类里面去调,肯定找本类的嘛。那你你为了要找到父类这个被你这重写的方法,那你必须得加super,那你如果不是重写,那你直接写就完事了啊同学们好,Super super。好,这个又说完,我们来运行一下,看看这个效果啊,看这个效果,那么我们创建一个employee。
12:03
Employ等于一个employee。好,Employee呢,我们直接来玩一把,好吧,直接来运行一下就可以了,Employee点我们的print好,这个时候呢,他会走这段代码,先打印出这个name,这个name呢是从父类那边过来的,对吧?Com。啊,汤姆,当然这个本质大家应该知道,仍然是调用的这个其实相当于是调用的this点,啊this呢,实际上还是调用我们函数把汤姆输出来,然后再调用了负类的这个person的这个方法,也把这个汤输出来,然后再调用hi。好嗨,那我们就写一句话吧。谁害?Say hi。好朋友们,我们运行一下这个就O了。运行一下,同学们请看效果。跟我们分析的一样,诶这方有一个小问题啊,这个是可能是代码,那改了一下好正确的先调用的是咱们子类的print name,再调用了person,就负类的print name,最后调父类的一个C。
13:07
好,那么这个呢,就是我们的一个案例啊,这个这个案例我就说到这啊,比较简单,重点就是要说明要需要加override啊,如果调超累的方法呢,叫super好调super好这点我们说到这里,那给大家板述一下。好,放到这儿。好,同学们,我们把它拿到这里来。给大家写到我们的笔记中去啊,写到笔记中去,插入一个小表格。好,接着继续往下看。接着继续往下看。好,我们先截一段视频。
我来说两句