00:00
好,那咱们下午呢,接着来讲课,那首先呢,来提一个新的知识点,叫super关键字啊,这个super关键字,注意super那个超级的那个意思,别看到那个叫supper吃晚饭那个晚饭了啊super的意思,呃,我们呢,其实到目前为止的话呢,没有接触过这个super,但是呢,这个之前我们在调这个构造器的时候呢,在我们用source的时候呢,你发现呢,出现过这个修的关键字,只是说我们给删掉而已,那我们来看一下说这个关键字的话呢,到底怎么去用,其实现在的话呢,我们也有一个场景啊,通过一个场景来引入,就是呢,咱们上午写的这个练习当中,是不是有这个叫cylinder啊,这呢叫圆柱,这个圆柱的话呢,我们继承于circle以后,咱们呢,重写了父类当中这个叫find的area这样的一个方法,此时的话呢,Find表示的就是圆柱的体的表面积了。表面积了,然后原来呢,咱们在这个find volume,就是求体积的这个方法当中,咱们用了一下find area,当时呢还是负类中的,但是由于我们此类呢,重写以后。
01:03
那这时候呢,范瑞就不敢用了。因为这时候用的话呢,相当于是你重写覆盖父类以后的这个方法了,那这时候就想,那我们还有没有办法呢,去用一下负类中的这个这个这个方法,说白了就是这里边出现一个情况,就是我们父类当中定义过一个方法,此类呢把这个方法又重启了。现在呢,相当于是有两个这样的方法了,这个方法的话呢,咱们默认的情况下呢,现当于用的是你此类重写这个,那现在就想有没有办法呢,区分出来这两个方法,让我们也可以去用一下副类当中被重写的这个find,这时候我们相当于就要使用这个叫super,所以从这个角度上来讲,咱们这个super呢,跟前面讲的这个this呢,这个还有点这个相似度哈,就是前面讲this的时候提过,说是因为咱们这个属性和我们这个行参啊通名了,咱们这时候呢,就不得不用一个叫Z来区分一下,我们调的呢是这个属性,那现在这个super呢,其实也有点这个像现在的话呢,咱们有这个叫子父类的这个概念了,然后父类中呢定义这个方法,子类呢,把这个方法给重启了。
02:12
那重写以后呢,就叫覆盖了,咱们在这个子类当中各种去用的话呢,发现都用的是你这个重写的,这个默认的就是它了,那现在这时候想说能不能还用一下人家负类中被重写那个方法,相当于也是想把它俩呢进行一个区分,这时候呢,我们就用修复呢去修饰这个方法,修饰以后呢,它这时候表明的就是掉到负类中这个被重写的方法了。啊,这就我们这个super的一个使用,其实这一说呢,大家就清楚了,那下边呢,咱们对它呢进行一个总结一个说明,那这块呢,我们这个新建一个class啊,这块呢,我写成还是用咱们这个person来说明啊,那其他的这些呢,都关掉。哎,Person是一个,然后我们再来一个,呃,具体的比如还叫这个叫student了,Student好让他呢去继承我们的person,哎,这是继承,然后呢,我们再专门的写一个,哎,叫super的一个测试。
03:19
哎,叫super关键字的一个使用,行,这呢就说的这个super,那首先呢,说这个super的话呢,相对于这个Z,咱们当时讲说Z呢,可以理解为呢叫当前对象,或者呢叫当前正在创建的对象,那这个super的话呢,我们也可以把它呢叫理解为。啊,理解为呢,叫哎副类的哎负类的什么什么什么啊这样的一个结构啊,那么我们这里呢,就提到了说这个修复呢,它呢可以用来呃调用或者叫修饰什么呢,呃修饰这个属性方法构造器这方面呢,和我们这个Z呢又比较像,那下边呢,咱们就具体来展开关于这个super的一个使用。
04:08
啊,关于它的一个使用行,那这块的话呢,也想展开来说明,咱们需要呢,把这几个类呢给丰富一下,首先呢是我们这个person这块呢,暂时我也先不考虑这个封装性的问题,我呢都把这个权限呢生明成一个默认的了in特性的A,诶构造器的话呢,我们也可以去给大家提供我这块呢先快速的呢把这个类呢给它搭建起来。来这呢,提供一个,然后我们还可以再去提供这个两个参数的。那这个时候呢,咱们也讲过,说这个Z次来修饰这个构造器了啊,然后Z4.a值等于A制行,这是关于这个person类,然后呢,我们再加上两个方法吧,方法。
05:01
来人吃饭。给我们再来一个叫work。诶,人走路行,然后呢,在我们这个student当中,我们在继承它的同时呢,就获取到它内部生命的这个属性和方法了,我们还可以再指定自己所特有的,比如说磁针形的,还是叫major,那接着我们再去提供这个构造器。四针形的。行,然后这个方法这块的话呢,我们也可以对父类中的这个方法呢,进行这个重写,诶重写的话呢,一方面大家可以直接呢给它把这个声明这样啊,CTRLC这样粘过来,这是上午说过了,或者呢,你直接在我们这个位置呢,点个it al斜杠,这呢也可以进行一个重写,这个呢我们先把它删掉,哎我们先自己呢写一句话,这叫学生啊,多吃有营养的。
06:13
这个食物保存,然后的话呢,我们再定义一个自己所特有的方法public avoid叫study。好,这个呢,我们叫,哎学生这个学习知识保存好,这呢是我们特有的一个方法,这样的话,这样的话呢,我们把这个student类呢,暂时呢就先写成这样,然后在我们这个,呃,具体的叫super test当中,我们呢去根据你需要,你想创建谁的对象呢,就创建谁的对象,哎就这样个情况了,然后呢,我们现在来谈一下这个叫super克的一个情况的使用啊,那么super克呢,看到说它可以来调属性,它呢可以来调方法和调构造器,那分别呢,我们去说明一下,那首先的话呢,我们提一下叫修克调属性的这个问题,修克调属性刚才提了,它呢理解为叫副类的,那所以我们主要呢,是在student这个子类当中来看如何调负类的结构,比如说我们下边呢,这有相关的,这个叫方法了啊,在方法里边我们可以去试图调副类中的这个属性,我这呢,比如说写个受。
07:23
受这里边我们这呢,显示一下说学生的这个name是多少,我们这呢就加上一下这个name属性,然后呢,在加上逗号一下,说age是多少,我们再加上一下这个age,那么此时的这个name和age呢,都来自于咱们父类,哎,这个大家都比较清楚啊,像咱们前面讲过这次了,我这呢是属性,属性前面的话呢,我们都什么也没写,其实是应该有东西的,这种情况下呢,相当于咱们省略了一个Z次点。这还是跟原来讲的是一样的,省略这个C点了,这呢也是相当于省略个C点,这是没有问题的,那这个修的话呢,你会发现我们现在用这个super去调edge的话呢,也能调,这次也能调super人调,目前来看,其实从我们程序执行上来看,没有什么区别。
08:16
目前来看没什么区别,那么这个真正在调用的时候呢,它的区别是什么呢?就是我们这时候呢,这次去调内我呢就去当前这个对象里边这个对空间当中去找这个内幕结构了,找到了啊,那就找到了,这个呢一找也找到了。啊,就是首先呢,都可以调,这个区别在哪呢?就是我们此时呢,其实没有什么这个这个冲突的情况啊,就是我们在内存空间当中,我这是一个站,这是一个堆,我们这呢,回头去造个对象,比如叫S这个student,我们在这个堆空间当中,我们去拗了个对象,咱们也说过了,这个子类的对象创建好以后,对空间当中子类父类中的属性呢,都会有,所以这里边这个name。
09:02
Age,还有我们这个major呢,其实就本身都有。本身都有,然后我们这次去调也好,还有super去调也好,其实都可以调用到你这里边想要的这两个结构。啊,那么什么时候非得我们用super呢?现在说一个情景,就是如果咱们的负类当中,在我们这个这个person里边,我呢,定一个叫in型的ID。把它呢,就像我们每个人一样啊,都有这个叫身份证号啊,如果要是身份证号,其实应该用个string型的是吧?哎这个我就暂时呢先用这个int来表示了啊这呢,我有一个比如说表示这个身份证号了,然后呢,在我们这个学生这里边的话呢,诶我也定一个int型的个ID了,这个呢啊叫学号。本身对一个学生来讲呢,他确实需要有两个号,一个呢就是身份证号,一个是学号,那么这时候呢,有个问题了,我们子父类当中出现同名的属性了,类型也一样,那这时候呢,我们要想一下那内存当中。
10:08
这算是有几个ID,对,首先让你明确是两个ID,也就是说对于属性这块来讲,不会像方法一样呢,存在这个覆盖之说,属性呢是不会覆盖的。也就是说呢,我们属性在内存中,此时呢有两个ID,这个大家要清楚,那有两个ID了,那下边呢,我们接着看这个问题,我们name跟age呢,没什么毛病,这个你这样写都还行,那现在的话呢,如果我们想去调ID了。这个时候的话呢,我们写了个ID。嗯,这个为了好演示,我在这个位置呢,我先给它赋个值,比如叫1001,在我们student这块呢,我也先暂时的赋一个值,叫1002,好,那么我们现在呢,打印一下这个ID。这是我们通过对象来调的,那对象之前的话呢,在对象调方法之前呢,我们这个显示数的话,肯定都已经做好了,那么这时候问一下,就是我通过student调授方法出来的ID是1001还是1002100几啊,诶1002,你看我掉下这个收方法保存。
11:27
执行,诶看到确实是1002,也就是说呢,它默认的时候呢,是不是掉的是我们自己这个声明的呀,嗯,咱们说了属性呢,是不会出现覆盖的了,那既然这样,我们如果还想去掉负类的那个ID,那怎么办呢?这时候呢,对,就需要用一个叫super来调了。你看我这呢,加了一个叫super点,那这个呢,指的就是我们副类当中的这个ID,来来看我这边呢,再去收一下。
12:03
哎,你有看到这掉的确实是负类当中的这个了。那这呢,其实就是我们说的关于属性这块的一个区分啊,属性这块区分,那大家看像这个ID这块呢,你写的比较完整了,加了个Q点,这个呢,我没有加,相当于前面略的是谁对这块省略的呢?就是这点ID啊就是这样的情况,好那我们总结一下。我们呢说在子类当中,准确的说,或者子类的方法,或者构造构造器当中,咱们呢,可以通过修复点这个属性的方式呢,显示的来调用父类当中的这个属性。啊,但是通常时候呢,我们可能都会省略掉,比如说你像这个A啊,包括像前面这个Z啊,我们都给省略掉了,但是如果呢,出现子父类当中出现了叫同名的属性的时候,那我们这时候呢,呃,为了能够去区分,咱们必须要显示的使用休克点的方式呢,表示掉的你是父类当中的这个属性。
13:04
啊,那这次的话呢,你表示掉的就是子类当中的这个结构。其实具体来讲,包括像上面这个有什么区别呢?其实是这样子的啊,像这个咱们呢,写的一个c.name它也是先在当前的这个student类当中,我去找一下,看看有没有这个叫name属性的这样一个结构,一看没有,如果在自己这个类里边没找到。他再接着呢,去他的父类当中去找,哎,就找到了。这是它,然后我们这个要写的super角age呢,它就没有在对本类当中去找了,直接呢就奔到它的父类当中去找了。啊就这个情况,那ID呢也是一样的,这个呢,因为它在本身自己这个类去找的时候,是不是找到了,找到了我就不往上找了,所以这呢就是1002,而这个呢,一上来就去负类找了,所以就把他们本类这个给过掉了,哎这样的情况啊行,我们把这个呢这个来总结一下啊或者我们先诶泛泛的来说这样的一个情况看先写这样的一个3.1啊说呢,我们可以在这个子类的方法,或者呢是构造器中,哎这个通过使用哎super点。
14:22
修复点这个,这个我们写一个属性。或哎修复点方法的方式。方法这样的这个方式,然后呢,叫显示的。调用调用什么呢?叫负类中声明的这个呃,属性或方法,这呢是咱们说的,哎,这个咱们在子类当中呢,是可以这样来用,表示呢,就是显示的调用负类中生命的属性或方法啊,但是呢,通常情况下呢,通常情况下我们都习惯了去省略这个super点。
15:16
通常情况下,咱们就习惯了去省略这个叫super点这样的一个结构了,哎,就好比是我们在这个student当中,像这个name和age的话呢,咱们其实呃,就有时候呢,就都不愿意去写了,像以前这次也是一样都不愿意去写了,这就是我们通常情况下的一种写法,那下边呢,来说这个特殊情况,特殊情况的话呢,就是当子类和父类当中定义了叫同名的属性时。定义了叫同名的这个属性时,那么我们呢,要想在子类当中调用父类当中生命的这个属性,要想在子类中这个调用父类中声明的。
16:08
属性则要必须显示的,哎,使用。使用就是我们这个休克点属性的方式。方式,哎,然后表明呢,调用的是父类当中这个属性,调用的这个是哎,负类中声明的这个属性。啊,这是我们刚才说的像ID这样个情况,呃,当出现同名的属性时,我们想在子类中,这样父类中什明属性必须显示的,使用修克点属性的方式表明掉了呢,就是父类中生命的这个属性啊,这就说完了,那么属性的话呢,通常咱们在开发的时候呢,子负类中一般都不会去定义同名的属性的,即使呢,像这里边ID那一般呢,也会在这里边写,这就叫具体的叫你的这个身份的一个ID,就是把这个属性名呢,再给它具体细化一下,这个起一个具体的名,这呢也起个经典名,就是通常在开发当中呢,子浮类不会出现同名属性的,咱这儿呢,咱们也给大家演示了一下啊,你能知道呢,我们要调的话呢,其实也可以做一个区分啊,就是这个情况,然后的话呢,我们再来说这个方法的问题。
17:24
方法方法的话,这呢,就这种情况呢就比较多了,我们在父类当中呢,定义一个方法,此类呢,对这个方法呢进行了一个重写。进行重写以后,我们如果在这个子类当中去使用这个重写的这个方法的时候,显然这时候这个方法呢,都是你重写以后的这个方法,这个呢,其实前面还是相当于有个这次点的,就凡是我们看到前面没有加的呢,默认都是省略的这次点。都是这种情况啊,那么我们这比如说study,我调了一个it方法,在这呢,我们调一下。
18:02
S点掉一个。你看这时候呢,就是我们这个叫,诶不是调E的方法了,调我们这个叫study的方法。那这时候的话呢,你发现它里边调的这个it方法,就是我们重写以后的这个情况了啊,重写以后的情况,那现在呢,我们就需求就是我现在不想调我们重写以后的这个了,我想调的是负类中被重写的这个方法,那就得用一个super点。哎,这样就OK了,我这两个都保留着,然后我们在这呢再来测。好,这时候你会看到这个负类中这个方法呢,就可以被调用了啊,就是这样的情况啊,那么对于我们负类当中,你看哈,我这还定了一个叫work方法,这个方法呢,在此类中呢,没有重写,没有重写,你说我这时候写这个work,它是不是就。
19:01
不用考虑这些事儿了,我这呢,你写个this可以吧,我这要写个super呢,是不是也一样啊?哎,这呢,就跟我们刚才说这个name和age一样了,就是对于子父类,子类呢,没有重写父类中的方法,你这写个this,写个super其实都可以,你要非要说它俩有什么区别呢?也可以说点区别,那就是说你要写this的话呢,它是不是先在本类当中去找这个方法呀,对,然后找没找到,没找到那就接着去负类找啊,而你要是写成super呢,对,那就直接去负类找了啊,这个大家还要注意,就是我们这时候说的叫负类,不仅仅是说我们这个子类,它的这个负类啊。对,还有可能是它的间接类,就比如说我们在这个类当中,我定义了一个属性叫做A值,你想在这个类中去用,我写了一个叫super点。他呢,先去我们的直接负雷中去找,没找到,没找到再往上找,如果还没找到,那就再往上找,直到你找到为止,上面这些呢,咱们都叫做负雷,都叫做负雷了。
20:08
行,这呢就是咱们说的这样一个情况,那对于这个work的话呢,通常咱们也都是习惯上去省略掉了,哎,好把这个情况我们说一下,这个特殊情况呢,就是这个子类,当子类重写了父类中的方法以后,说我们这个想在这个此类的这个方法中。哎,调用负类中被重写的方法时,方法时,那么则必须呢显示的使用。哎,Super点方法的方式表明呢,调用的是父类当中被重写的方法。方案的方式,呃,表明调用的是父类中,哎,被重写的。
21:04
方法。啊,这呢,就是咱们说的关于这个super克掉属性掉方法的问题,总总结一句话呢,就是说白了还是出现这种同名的情况了,只要没有同名的话呢,其实一切都OK啊,你只要同名的话呢,这个时候不得不去用super表示呢,就是调用的是负类的啊这个意思啊,这个要清楚以后呢,咱们再回来看咱们说的这个叫cylinder。啊这呢是这个子类,然后呢,咱们呢,因为重启了这个find a了,导致呢,咱们就不能这个再去用这个find艾瑞了,因为成了你自己的方法了,但是呢,咱们现在呢说就可以想办法去用了,只需要在这个位置呢,我写一个叫super点,诶这个时候呢就搞定了,我点一下这个find,你看直接就蹦到我们负类中了。啊,你要是没有写这个修克点,哎,我这时候你看我点一下就蹦到这儿来了。说明此时呢,掉的确实不是同一个了,就。
22:01
CTRLS行,那通过这样的问题的话呢,我们就能够解决刚才那样一个困惑了,哎,我们想在此类中调用负类中被重写的方法呢,只需要加一个修破点就可以了,行,那关于修克调属性方法就这样。
我来说两句