粉丝27获赞285

想写出谁也改不出八个代码吗?快来看看 overlight 和 final! 我 要做一个超级机器人,父类定义了攻击方式,子类我要重写它搞定。子类的攻击函数写好了,喵,为什么调用的是父类的函数?我明明重写了!小宝,你掉进参数陷阱了!仔细看,父类参数是 int, 你 子类写成了 float, 这种错误太难发现了。编辑器为什么不骂我?因为编辑器以为你只是想写一个名字一样的星星函数重载,而不是重写 overlight。 你 需要一个安检员,在 c 加加十一中我们有 overlight 关键字,把它放在子类函数的后面,加上了会有什么魔法吗? 哇,编辑器报错了,他发现我写错了。没错, overlight 强迫编辑器帮你检查,如果不匹配,直接报错, 改成 enter 了,错误消失了,成功了! overwrite 真是太好用了,以后我写虚函数都要带上它。看来小宝学会怎么检查代码了。但是如果有的功能,我们不希望别人乱改,怎么办呢? 问得好,有时候我们的机器人核心算法是完美的,不希望孙子类再去修改它,这时候就需要一把锁。锁,为什么要把代码锁起来?假设你的 dev 类里的 tik 已经是完美的版本,如果有人继承了你的类,又在其 sub dev 里乱改了一通,可能会导致系统崩溃。 太可怕了,我不要我的完美代码被改坏。这时候你需要 final 关键字,只要加上 final, 就 意味着到此为止,不许再重写了。我偏要试试,真的锁住了,连我都改不了了。这在设计库或者框架的时候非常有用哦,可以保证核心逻辑的稳定性。 爸爸,那如果我连这个类都不想让人继承呢?比如这个核心密码类,完全不能有子类,非常敏瑞, final 不 仅可以锁函数,还可以锁住整个类,这样写 secret box 就 成了断子绝孙类,谁也别想继承它,这就是最强的防御。我们来复习一下 overlight 减视镜,防止你写错函数签名。 final 是 大锁,用在函数后禁止此类重写,用在内名后禁止别人继承。而且使用 final 还有助于编辑器优化代码,因为编辑器知道这个函数不会被修改了,运行速度可能会更快哦,既安全又变快!这两个关键字简直是神器,现在的代码我看谁还能改出 bug! 这就叫防御性编程,让错误在编辑阶段就暴露出来,而不是等到运行爆炸了才哭。好了, bug 修完了,该休息一下了,让代码更安全,从关键字做起。


欢迎大家收看由小风教学网推出的 python 编程基础系列教程。我是鹿闲草,本节课的话,我们来讲一下这个面向对象编程的第二讲继承。 那之前我们讲过这个 o p, 也就是我们的面相对象编程带来的好处之一就是代码唇釉,那我们通过这个继承机制可以很好的实现代码唇釉。这就好像说 你的一个手机产品,比如说我们的这个苹果吧,它更新换代,它可能有苹果一代,苹果二代、苹果三代, 四五六七一直到现在的十一 pro 是不是什么的?那这个的话,其实它每一代的话会继承上一代的一些优点吧,所以这个的话其实就叫做一个继承。而我们在类当中呢,也是可以通过继承 来继承负类的,我们来通过实力来写啊,比如说我现在的话,我就进一个类,那这个类,比如说叫 father。 哦,如果你不继承的话,大家还记不记得我们讲的时候 class 和方式的不同,就是你不用写那个括号,对吧?直接写一个 father 就可以了。然后我们来定一些方法,比如说这个 father 它会干嘛呢?它会, 他会赚钱,对吧?嗯, print 一个,我主要负责赚钱, 然后再他还会一些别的,比如说他会 traffic 驾驶, 我会。 哦,我们就先写这么多,那么他可能还有一些其他的技能,比如说,呃, mars three, 我数学,嗯,我数学学的很,这样子, 让写吧。然后下面的话,这个数学学的很好,更直观来说可能是一个属性,但没关系啊,我们这边的话就假设他是一个方法吗?就是我要不写成我会学数学吧, 这样子,那么这个时候出现了一个子类, 就是儿子,那么这个儿子的话,我们假设说这个儿子他就继承了父亲的所有的技能,这个 之后的话我们就可以通过继承,通过这种写法定义一个 class son 就是儿子类,然后他呢继承的是他的 father 副类, 这样子的话呢,我们就那他可能还有一些其他的技能,比如说他,呃,可能他的他就是英语很好了,那这样的话就是并不会学英语,我们就写一类啊, 但是你看啊,我这里的话我没有定义任何东西,我现在的话就是这个 so, 我们我们可以来给它就是实力画一下,然后定一个变料,呃,这个变料的话,它就是这个 把它实力化成一个对象。然后呢我们我们你看一下,我现在来调用一下这个丧的,那这个丧的话,你看他 只有一个方法是 english, 对吧?但是你看我,我竖这个算的时候,他给我提示是啥?他给我提示竟然是 get morning, driving 和 mass, 那这个的话其实就叫做继承。我们来进行一下,看看大家看到没有,这个儿子类,他虽然我们在他内部并没有去定义这个 good morning, 然后什么 driving, mass 这些方法,但是呢他继承了他的副类,所以呢他也直接具有了副类的一些方法和属性, 这个的话就叫做继承,那这个的话就是一个单继承,也就是说我们只继承了他的一个负累 啊。还有一个就是说我们之前不是讲了一个 english 构造方法吗?那么 english 构造方法的话,如果你的负累当中, 如果你的副类当中有这样一个呃 init 构造方法的话,那么你看一下我现在来运行,你看这个 init 在它的这个 sum, 如果这个 sum 继承了 fatherlay 的 这个继承这个发位,然后还有一个构造方法的话,那么在我下面创建对象的过程的时候,他会自动的继承这个构造方法,也就是说构造方法我们说了只要他一实力的话,他就会立刻的运行,所以的话你在继承的时候呢,也是会继承这个构造方法的,所以你在创建的时候他就会直接去运行了。 哦,然后就是还有一点就是关于在此类中如何去调用这个负类的方法。呃,其实大家也看到了,我们这里的话 是可以通过一个呃负类的名字,然后加上一个方法的名字,稍等一下, 好不好意思啊,刚刚走开了一下,我们接着来说,刚刚我们是讲到了在此类当中如何去调用副副类的方法,那我们知道肯定有一种方法是通过副类的名字加上方法的名字来进行一个调,当然这里的话你可以传一些参数进去,但是 还有一个方法是通过搜索函数来进行一个调用,那我们依次来写一下,这里我说的并不是在这个类之外去调用,在类之外去调用,我们之前已经讲过了,就是直接的用用这种方法去调用, 我们现在要说的是在这个词类的方法当中去调用一个副类的方法,那这个哈之前讲我们 可以通过这个 father 加上一个方法名 at money, 然后就进行一个钓友,那么如果我们把这个,我们刚刚两行是把这个算实力画了 独立化了以后我们是调用了 song 的一个 english 这个方法,那你先拿去看一下 好保险这里的话要打一个 sales 进去啊。哎,你看这样的话是没有任何问题啊,这构造方法我们就不用了,我们现在的话不讲这构造方法 不要了,看起来乱七八糟啊。这样子哈,你看一下他是不是在这个子类当中,我将用的是子类的 english 方法,然后这个 english 方法呢,调用了副类当中的一个方法,这个的话就叫做在子类当中去调用这个副类的方法。 这个的话其实大家会发现有一个问题啊,就是说如果你的这个,如果你的这个这个这个负累进行了一些修改的话,比如说我现在不叫发的了,我改名叫别的名字,那如果你有很多行代码的时候,你是不是每一处你都得把这个名字改掉, 那这个的话其实是比较麻烦了,但是他也有好处,就是你可以非常直观的看到他是他是调用了哪一个副类当中的方法啊?这个的话也也是有利就有弊吗? 那如果要是我现在的话有很多个这个负累,然后我也不太记得我到底是要从哪一个负累当中去教育他的方法的话,这个时候呢,你就可以直接使用 server 函数去进行一个调用, 那这个 sopo 函数的话呢,就是我们可以直接的这个通过这样的方法去进行 一个角位。呃,这个的话,比如说 super mass 吧,就继承这个 mass 好了。然后大大家现在来看一下,他也是实现了这样一个方法调用啊,实现了这样一个调用,那这个的话就叫做这个在 style 当中是调用负累的方法, 然后还有呢就是重写,重写我们说啊,这个你在继承的过程当中,你既然选择继承这些东西,那么你可能对于他其中本来有一些东西,你也你也想要做出一些改变,那这个的话才是实现了真正我们所谓说的一个定制。 他如果说我现在想把这个 driving 方法进行一个重写,进行一个重写,那么你就可以完全在这个里面直接去进行一个操作。 你说我 crate 我会插卡, 比如说他升级了,现在的话不仅仅是会开车啊,还会开卡车,那这样子的话,我们是不是这是属于职类当中的一个同名方法,然后就直接在职类当中对于这个同名的方法内容进行一个重新的改造即可。 这个时候呢,你来看一下我教用这个词类的 driving 方法。好,我们 print 一下这个的话是不是就实现了一个方法的重新写,重新写就叫就叫做改写,这个的话也是一个重写 啊,之后的话还有一个关于多继承的问题啊,就是说你的这个子类有的时候他可能继承多个负累啊,这个的话其实叫做一个多继承,然后多继承的格式呢,就是在我们刚刚单继承的形式下加一个逗号,然后把你第二个要继承的负累 的名字反进来就可以了啊,这个我们可以再操作一下,我们现在的话在定一个 butter 嘞, 哦,这样子啊,然后我们正妈的还会干嘛呢?比如说 cooking, 会做饭, 我们再继承一个 hotwork, 那其实这个还是没有任何逻辑的,一定说你父母会什么,你就一定会什么,我只是拿来举个例子而已,这样子的话就定义好一个 motherly, 然后我们这个算的话,他现在还可以多继承一个 motherly, 嗯,这样子啊,你看他就同时可以去调用这个,呃, motherlay 和 fatherlay 啊,比如说现在的话,他就可以去调这个 hotwork, 你看这样的话还是没有问题的啊,但是啊,但是啊,这里有一个问题,就是说如果你继承了两个副类,比如说 model 类和 fadel 类当中他们都同时有一个同名的方法,比如说这个 gift money, 按比如说这个 valerate, 它也会,它也会赚钱啊,对吧?他们现在是不是就有一个投币的方法了? 是不是有同名方法 get money? 那如果我现在去继承的话,那到底是使用这个 follow the get money 呢?还是使用 motherlay 的 get money 呢?这个的话就是一个关于同名方法的一个问题,这个的话我们是可以来查看它的一个调用顺序的,这个代码的话我在下面我给大家写出来,然后你们自己 可以去看一下,就这个代码的话大概的意思都是一样的,但是我可能在讲的时候呢,不可能把这个这个转这个,每个方法都写的一模一样,但是意思的话是一样的。那这个话,比如说我们现在来看一下这个丧啊,我们来看一下这个丧的一个 它的一个掉落顺序,我们是通过这个跟 index 那个写法一样,就是两个下划线,然后前后两个下划线,然后 m r o 这个话就可以来看它的掉落顺序啊,这时候你看一下 啊,这个我只是把它实力化了一下,这个的话可以注视掉,无所谓的,我们等一下的话还得看,所以先把它注视掉啊,这时候你看一下它是打印出了一些东西,一些 class, 一些类出来, 而这表示什么呢?这就表示当你的不同的类当中同名方法的时候,我会优先的去使用哪一个类当中的方法,那他首先会去找你这个 so, 也就是这个儿子类当中他的他有没有这样一个方法,比如说这个 get money, 它会优先去找这个 song 当中有没有这个 get money, 那我们看到它现在的话是没有的,然后第二个还是会去找什么呢?去找你这个 follow 类当中有没有这样一个方法, 显然是有的,有的话他就会直接调用发轮内容的方法,这时候你看一下我们的结果他,他调他这个最终打印的是这个,对吧? 调用的是发的类当中了,然后如果要是发的类没有的话,他才会去选择调用 model 类。然后最后还有什么还有一个 class object, 这个 object 呢,就是 person 当中 就是每一个对象他都继承自这个 object 类,就是所有类的一个鸡类,基本的这个类型就叫做 object 类,这是拍摄当中的一个东西,你们可以不用去管他,那主要呢你们就是要明白他的一个 查找同名方法的顺序,就是首先先到他自己本身的这个类当中去看一下有没有这个方法,没有的话他会按照这个顺序,如果你现在把这个 father 和 mother 调用一下的话,就调换一下的话,我们看一下 他这顺序就变了,他是按照你继承的这个括号顺序里面括号的这个顺 括号里面这个类的顺序来从左到右依次去查找了,然后找到谁呢,他就会先找到谁,他就会直接调动谁。但是其实这个同音方法的话, 呃,其实不太建议大家知道一下就行了,但是日常生活中不太建议大家去使用这个这样一个同病方法,感觉就不是很规范,所以我们尽量的话给他取不同的名字就可以避免这个问题。 那关于继承的话我们就讲这么多,因为我们课时也有限,所以要把很多的东西都跟大家带到也比较的, 所以有有的时候呢只能可能讲的浅一些,然后我们后面再宣告的时候再去跟大家补充吧。那本节课的话就先说到这里,非常感谢大家的观看,再见。

刚才的运输,那么接下来一个问题是,为什么要定义虚函数?虚构虚函数就是虚构虚函数,我们现在来看看虚构虚函数是不是定义了虚构虚函数。我们 i 这个希格虚函数,你看 transport 是 自类自类,对吧?然后是 virtual, 它是虚构的虚函数,只知道并且它的实心不需要写,也定义为 default, 对 吧?那么为什么我们要定义这个希格虚函数呢? 等下列条件满足的时候,必须将 g 类的希格函数升名为虚函数。 也存在继承关系,存在继承关系就是你这个积累至少有一个派生类对 𠲎 使用积累的指征和引用来指向派生对象,通过积累的即可操作派生类的实力, 通过积累的指征引用来销毁对象,销毁销毁指征。那么这时刻呢,我们需要把积累怎么样啊? 这十个函数定义为虚函数,如果你要不定义的话呢?因为虚函数的话呢,就会存在内存泄露的风险,或者是 这个派生利用的资源对象没有办法释放程序出现着哎不可确定的这个行为。所以当我们在内加这样的这个系统软件,系统设计的过程中,通常是要把积累的 哎希克函数定义为虚函数的。关于虚函数的意思规则,虚函数是不能是静态函数,虚函数可以是另一个类的有源函数,只能通过积累类型的纸张或引用来访问虚函数,以实现运行时的多态性。 虚函数的原型在积累和派生类中必须是完全相同的。虚函数时常在积累中定义,在派生类中重写。在派生类里面怎么样?他有重写它,但是在派生类中不需要在函数的前面加上多少了。派生类 默强制覆盖虚函数。就是说有一次虚函数呢?在 python, 在 器类的定义,在 python 里根本就不需要用它。那么在虚在器类里面,我们就简单地给它置空,或者是返回,返回一个零,返回一个空的,对吧?那么在这种情况下呢, 可以使用积累你的版本,但充续函数就不行了,对吧?积累准有续函数,成有积累准有续函数成员的时候呢,说明累会被继承。 七个函数应该定义为虚函数。积累中有指数变量的时候,七个函数必必须定义为虚函数。如果积累中的虚成员函数后面跟着个零,这表面虚函数为纯虚函数, 不能直接生成积累的指数或隐喻对象。你不能直接六这样一个积累的对象啊,因为他有,他是纯虚函数。 那记类中的成员函数全部是纯虚函数,则该积累一般称为抽象类。在派生类中一定要实现, 要实现纯定义,这是。哎,虚函数,纯虚函数。谢谢广大。

今天呢我们一块来看一下啊方法的覆盖,覆盖呢啊要求啊是发生在继承里边,比如说呃此类呢需要重写复类的同名方法 什么场合需要覆盖呢?比如说当紫雷中定义的方法不适合紫雷去使用, 那需要你进行扩展啊,这就是说需要子类重新定义,那么子类定义的方法怎么呢会对外而言啊,注意一下是对外啊。呃在外部用户使用的时候那么就可以啊通过覆盖啊调用子类的方法而不是使用的是副类的方法。 方法的覆盖呢有这样两个原则第一个方法的名字和参数啊要求和复类 保持一致,同时呢方方在子列中啊方法的修饰符必须他的范围必须要大于或者等于副类同明方法的修饰符,那么这个范围呢咱们之前也说过啊,也说是什么情况呢啊?呃 public 最大,那么 无休是福是第二还有一个什么情况呢?是 private 啊, private 最小啊,如果说你的范围缩小的话那么这个地方呢会报错会报错,所以咱们首先第一个呢来过一会呢来定一个学生类,咱们一块来看啊。 那么学生类呢目前啊呃定义了两个属性,一个是学号啊,一个是学号呢,那么另外 一个是他的什么呀啊他的名字啊他的名字。呃咱们为了方便呢我这样啊过一会呢会给他初始化一下啊,随机的初始化。那么接下来咱们来看一下有一个代码啊, 咱们知道 system out print learn 这个方法呢可以怎么办?可以输出对象,包括八个基本类型啊,都可以进行输出,还包括字符串,那么其实这行代码是什么效果呢?大家来看一下啊,等同于等同于啊,下面两行代码,第一个 把参数 o, 这是一个对象,把它呢向它发一个消息,你转换成支付串,然后呢怎么做呢?我就输出啊,得到的支付串,比如说在 object 里里面呢, 定义了这个 twostring 方法,而 object 类呢是所有类的子类,所以说所有的对象都会具有啊,自动继承啊 twostring 这个方法, 那么在输出的时候呢,其实就是说通过 tostin 啊得到它的字符串的十六定制值,然后呢得到一个输出, 那么这样的话该怎么去应用呢?咱们来看啊, 那么我构建一个对象,为了方便呢,我把他的学号设置为一名字呢,设置为 a, b, c, 但是这个呢应该是添加构造方法,呃,我目前这个方法呢,不是很严谨啊,所以咱们这样先去这样来完成啊,接下来呢去输出一下 啊,咱们这个对象 s, 看看结果是什么样啊?代码保存,同样学生类呢,也需要保存好,看一下运行结果。 大家看到输出值呢,是这么一串值,是类名加上一个十六进制的一个啊字符串,那么这个值是在哪呢?比如说咱们刚才说了啊,是 就相当于啊,像 s 对象他继承而来的这个 toos 确定方法,咱们把它呢来做一个输出 啊,看到我的第二行怎么样去输出这个 s 二,你会发现呢,这两个输出啊,就会是相同的,会输输出呢两个相同的字符串 啊,大家可以看到是很明显是一样的啊,这两个这两个字符串是相同的,说明啊,咱们的效果是相同的,比如说还是验证刚才的代码 是吧?向对象,哎,向对象呢,发了一个消息,转换成字符串,再去输出这个字符串,那么 tos 训方法呢?咱们可以按一下 ctrl 啊,点击这个什么呀啊,点击这个方法 去查看代码啊,之前也讲过如何去查看原代码啊,咱们今天呢,这个地方就不是咱们的重点,咱们就不去啊,讲解了, 咱们的重点在哪呢?在这个地方啊,就说既然说啊,在负类子负类中, object 定义了 toostrain, 不适合啊子类来使用,那怎么办?咱们要去覆盖,怎么去覆盖呢?咱们看一下 eclipse 帮助大家啊,实现的一个方法, 我要去覆盖啊,字符串类的那个方法呢? tostring 好了,看一下菜单,上次菜单里面呢,有一个什么呢?有一个叫 override message 啊,是这个选项啊, 这是要生存代码,所以都在 souls 菜单里边,咱们去选择什么呢?叫 toolstring 方法, 选择一个,确定咱们去覆盖这个方法。覆盖方法呢,咱们这次完成的比较简单,怎么办呢?咱们就用学号加上名字,这样的话刚好是一个字符串,把它的状态值呢啊,都去做一个输出,为了方便呢,我怎么办呢? 我再加上一个分割符啊,加上一个逗号啊,逗号。那咱们看一下在覆盖之后,那怎么办呢? 在外部用户啊,去调用这个 twostring 的时候啊,是使用的 object 类的 twostring 还是学生类啊?覆盖的啊,这个 twostring 方法,那么咱们看一下运行结果, 大家看到这两侧很明显都输出的是什么呀?是咱们 覆盖后的结果啊,这也验证了咱们在刚开始啊啊说的那句话,有时候怎么办呢?在对外部用户来说,那么你怎么办呢?你使啊,使用的是子类中啊覆盖后的方法,而不是负类的啊同名方法。 那么希望这个视频呢,让大家对方法的覆盖啊有一个更好的认识,同时呢能够学会在 eclipse 里边啊,如何去 啊自动啊,通过菜单呢,帮助咱们覆盖方法。那好,今天的视频呢,到此结束,感谢大家的收看,再见!

接下来我要给大家讲的内容是子类调用复列的方法,那么经过重写以后来我们先看这个代码,跟着思路,我们先看这个代码,先别往下走,先看这个代码,看它,然后你把下边这一图给它。干嘛呢?把下边这一图就当没有 啊,就这个玩意就当没有。来,我再大一点,就这个,你就先当没有就行了,先给他盖住啊,先当没有?那我问你个问题啊,那呀,这个盖多了,应该把这个地方给它漏出来,然后橡皮擦能擦掉这个抹码吗?哎,好像可以,是吧, 这个码能擦掉,行,就擦到这来。那你告诉我一件事啊,跟着我的思路啊,跟着我的思路,别跑神啊。开始来了, 大家往这看,我先问你个问题,我的这个子类在这里边继承两个父类,这个大家应该不晕吧?不晕。好,那现在的问题是,我 如果把父类的这个属性还有这个函数重启了,那目前来讲是不是只能访问咱自个的父类在这里边是不是咋地都玩不了?那我的诉求就是 能不能实现在这个位置就是此类中啊。哎,我想调这个父,我就找他,我想调这个父,我就找他,跟上我思路了吗?这就是接下来我要讲的内容 啊。所以说,此类中仍想要保留父类的行为,则需要在此类中调用父类。方法可以直接使用父类名来进行调用。好了,整个视频就这么一个指点,你把它背下来就行了。 那子类怎么去访问父类的功能呢?原因很简单,来了,看代码了,叫父类名,点什么父类功能名,然后接下来干嘛呀?传一个 self? self 是 谁? self 其实就是子类对象啊,就是子类对象, 来吧,那接下来我们就直接开始了故事四, ctrl a 全选切到 high, 然后在这里边我们先往下写啊,零二,这个叫子类, 此类重写后啊,继续访问父类功能,然后方式一啊,方式一。好了,那接下来我们来写一下这个案例啊,这个案例呢?是此类重写父类功能后啊,干嘛呢啊?继续访问父类功能 啊。那么接下来我告诉你他的思路,有两种方式,那一是谁呢?叫负类名点点负类功能名啊,其实就是函数名,然后干嘛呢?里边传一个 self, 第二种方式就是 super 小 括号点,负类功能名, 功能啊,就是函数名。那这里边就不用传 cf 了啊,两种方式。那这两种方式有啥区别呢?来,我告诉你,他能精准访问啊,想找哪个爹?好像有点不太好听啊,想找哪个负累 啊?就钓钓用的钓啊钓用哪个负累?这种方式他不行,他不能精准访问,他只能访问最近的那个什么最近的哪个负累啊,干嘛呢啊?有就用,没有就报错, 虽然你继承了俩爹,但是他只找最近的一个爹,有就用,没有就报错啊,就玩不了了。所以呢,他不能实现这个操作啊,就是精准访问怎么怎么样,他做不了,他只能找最近的一个爹。 那以后用谁用的最多呢?还是那三个字叫什么?看需求。来了啊,开始来了,这个就是我们的故事四啊,故事开启了,刚才是到故事三,现在是不是到故事四啦?过来, 那么现在我要表达的点来了啊,听好内容跟刚才一模一样啊,老师,老师傅类, 黑马学校类,徒弟类这一堆的代码 ctrl c 都是一模一样的,甚至下边这个代码都是一模一样的。所以我要把刚才代码 c v 大 法直接贴过来。哎,能不能跟上我 solo。 这是刚才写的啊,咱自个敲的来,你看我改造什么?我改造哪里? supreme 我 改造了啊,开始改造了。 改造什么地方呢?在你的徒弟类里边加功能三点三,叫调用父类的功能啊。功能让调用父类的什么功能呢?你看啊,来,我问你,我能不能写个 make cake? 那 小括号我能不能这么写?不能, java 中可以干嘛?方法重在 python 不 行。不要按那一套来理解啊,在 python 中,那一套是报错的。因为什么?因为这个函数名是不是已经重名了, 那么将来你在下边访问,你只能访问这一个,那我就想访问复利的怎么办?看好啊,你可以在这做一个更名的动作。这个不是 make cake 吗?不再是 make cake 了,而是 make 什么 cake 呀?加一个单词, m a s t r make master cake。 我 是不是换了个名字啊?那好,那简单,你看啊,我如果还是在这里边来个 self 点 make cake, 你 告诉我我掉的是谁? 我钓的是不是还是就近的?是吧。那你想访问副类,请问 self 点 make a cake, 你 能访问到副类吗?不能。为啥不能啊? 被截住了呀。啊,被截住了,说得很对,就近原则是吧,拦截了。 self 点 make a cake, 你 现在是不是只能玩自个了?嗯,你能在这里边咵直接怼到这访问这个副类能做这事吗? 做不了,你开玩笑呢,你说访问他,我还说访问下边这个福利呢,跟上来了吗?做不了,做不了怎么办?好, ok, 看这看这,来念一下。就这两句话啊,这视频就讲两句话,确切的说这个视频就讲一句,下个视频再给你讲这一句。 来看一下怎么做啊?看一下这个格式,念一下叫什么副类名,副类函数名跟上来了吗?那好,那于是这个动作就变成了什么动作? five 点点。什么?不是 five 了,而是什么? master, 副类名点 make cake, 把谁扔进去啊?副,是不是把自己扔进去啊?副类就知道是哪一个对象了, 所以你这么一写,哎,我告诉你,这个代码就落地了,也就是说现在我们就变成了,当你通过副类指向的时候,它就找到这个副类了,所以你后面跟的功能全都是这个副类的功能 跟上来了吗?好,那你在这里边调 make 和 cake, 你 把 self 是 不是传进去了?那么请问。来来来,来,看,好啊,看好,那请问这个不用讲,右键执行,这还是刚才那个?是不是就这原则用的是自个儿的独创列队是吧?来, p 点 make a master pick, 跟上我思路了吗?嗯,我的问题就一个,当我右键执行的时候,这个地方打印的结果是什么?古法是不该古法了,是这意思吧?是古法我就不跟你讲了,是独创, 是独创,我告诉你,是独创,右键走,你看还是独创,蒙了吧。啊,你看这个从这就开始绕了 来,我要开始来了啊,好好听,为什么为什么?好好听好好听好好听。为什么?因为 master 在 这里边,你是不是传进去,其实相当是把这个函数拉过来,你就拉过来嘛,是不是相当是调这个函数, 调这个函数,哎,等会它里边是不是有个 self 点功夫啊?你是不是把 self 传进去了?你的 self 是 谁?是屁吧?那屁的功夫是啥?屁的功夫还是自己的那个?什么叫功夫? 如果你真正想玩,你得在这这么做。干嘛呢? master 一下, master 一下,点 you need, 你 调一下 you need 他的 you need, 然后 self 传进去,那是不是说明把这个 master 执行了?执行以后就说明现在在打印,这个结果就是什么?不是独创了,而是什么古法, 能听明白吗?现在用的是古法,哎,能不能看明白?我再问你个问题,他既然是古法了,我把 make cake 我 又调一遍, 告诉我现在是什么? make a cake? 我 钓的是不是我自个的?那现在到底是独创还是古法 独创还是古法独创?你又打错了,对吧?这个是古法, 你看蒙了吧?啊,对吧,我就说这个知识点就开始绕了,所以你看啊,那面试先说啊,老师面试会不会问这个? 百分之一百不会问那个?放心,百分之一百不会问。那老师你为啥还要讲那么绕?我希望这块你们能理解的比较到位一点。来了,我开始了,我把这块给你写一遍,他就一个原理,贼简单,特简单。来,开始了,我把这个代码带上,你画一个内存图, ms p i t 查找 s 保存到桌面。今天是我们的 d 零二 d 零二隋唐 学堂图片啊,昨天没做反馈,那几个同学要好好听了啊。因为我一会发完图以后我就问你了,这个打印结果到底是啥?你不会我就让你把这个代码全抄完啊,除了这些还有这边呢, 整个这个代码啊,所以好好听了,我一会就要开始找了,然后找的话不一定从第一个点啊,我可能会,呃,这个按顺序来定,比如第几个第几个我也没记住谁是谁,反正十三个人我就按顺序来抽了啊,抽到谁是谁来开始了。那接下来我们来画这个代码啊,首先 第一步操作就是这个 master, 咱是不是应该把它呼出来啊?好,那么这个操作听好啊,这个是图一,图一叫此类啊,访问互类功能 来,好好听啊,我快速画,尽量不占太多时间,跟着思路,我画的快一点,然后呢,你们跟着思路来听,其实这个代码我告诉你,贼简单,特简单,你要把这个原理有了以后你会发现思维类 啊,所以类来,这个是谁?这个是学校。那请问你的子类的两个副类是不是已经搞定了?那现在接下来咱来开始看看这个操作啊,把这个 这个类拉过来。 c, 这个是谁?这是不是咱的子类啊?把这个子类拉过来。子类拉过来以后,接下来我们把它往上提一点,然后往上提一点。干嘛吗?我是不是要在下边就可以写我的测试代码啊?好, ok, 把它扔上来,扔上来以后我的测试代码在哪呢?这是我的测试 啊, c, 好 来了啊,测试又正正好,哎,正正好,你看啊,是不是不用分屏了,再往上切一点点吧,我感觉有点太靠太靠下哎, so beautiful。 好,来吧,我开始了。那接下来我要做一件事情啊,这个地方我要画一个图,但是这个图我要画这么小,我应该是画不完的,所以这个图我就稍微往右边来一点点了。你知道我的图一般来讲是不需要不需要那啥的,就是不需要分屏。一般不需要分屏 啊,除非是这个代码太多了。那就没办法了,来,咱开始了,左边这个地方,告诉我左边这个地方叫什么? 叫站,很熟了吧?左边这个叫站啊,然后呢?呃,右边这个地方叫堆,下边那个地方叫方法区,但是咱现在不用,我不画,我就给你画一个堆,我要堆大一点啊。这个站他是不是要开口啊? 好,来,跟着思路啊。跟着思路,首先在这个地方我们先来这个叫堆区,堆里边存的是不是所有对象啊?然后这个叫什么区呢?这个叫站区。听好啊,你听一遍就听懂了,这玩意贼简单, 没你想那么难。来,跟着思路啊,首先第一件事情就是我要开始干活了。干活?那你想第一件事情想都不用想,一定是从哪个代码开始执行啊?比划一下,差不多这个代码,来告诉我第一行代码,我管你上班有什么玩意,第一行代码一定是从这执行, 这就是为啥我刚才给你解闷的原因,听明白了吗?啊?一定从这走接下来了吗? p 等于 percents 跟上来了吗? p 等于 percents。 那我问你个问题啊,那现在这个菩提寺是不是要去创建他的对象?是不是要在堆区开辟空间?创建这个对象是这意思吧,但是现在有问题啊。啥问题?你的方法区里边存的有这些类的信息吗? 没有的,所以此时会根据你的菩提寺的继承关系会做一件事。做一件啥事呢? 就是把你的这三类的这个点啊,文件加载到这个方法区里边做存储,这步我就不带画了,哎,跟上来了吧,内存中是会有这个动作的啊,不然的话那玩不了。所以呢,我就从这画,从这画,你看啊,我一画你就蒙, 我一画你就蒙了。那这个地方现在大家往这来看,那么此时听好了,听好听好,在这个位置听好了。你有一个什么呢? properties, 那 printf 这块空间,请问他有没有自己的一个地址值呢?是不是肯定有啊?有这个地址咱叫零 x 零幺,我来个红色的。 那现在就意味着一件事,零 x 零幺这个地址已经给到了这个 p, 那 换一只 p 是 不是已经指向这块空间了?嗯,好,那接下来你来看啊,那别忘了一件事。 啥事嘞?我问你。先问一个问题啊,当走这个代码的时候,他默认会执行哪一个魔法方法来着, 还记得吗?那我们说过,当你创业这个类的对象默认是不会执行一下引力特这个魔法方法啊。好,那么执行引力特,走谁的引力特?是不是走他的引力特呀?所以呢,这个时候就意味着,哎,来喽,看好 看好,别晕,别晕,懂不懂?就这些了, self 点空腹不是在这啊,他有个 self 点空腹这个属性就来了,然后这个属性的值目前来讲是个独创煎饼果的配方。 先说到这,不晕吧,为啥?因为你现在走了这行代码。走了哪行呢?走了这行代码 粗一点,你走了这行代码,那就意味着是不是肯定要执行他的什么这个魔法方法是不是走这一步啊?对,所以说那现在来了啊,来了别着急,往下接着看。走哪行代码了,该走谁了?普瑞克功夫,你告诉我?想都不用想。普瑞克功夫这个代码是谁? 绝对是独创。哎,跟上来了吧。独创啊,这几个字啊,能放下我就放这了。那接下来再来往下 p 点 make a cake, 你 告诉我他做了一件什么事? p 点 make a cake, 他 干了一件什么事啊? p 点 make a cake, 干了一件什么事?干了一件事。就是这个函数要干嘛? 要进站,是这意思吧?那进站进进呗,无所谓啊,你进进呗。啊,那这个时候看好了,我来个什么呢?我来个黑色的,你进站,我问你个问题啊,就近原则,我的 pertease 如果有 make take 我 就掉。没有是不是找福利要?我问你,我有吗?有,有,我里边一个什么内容? print 一 句话。 print 一 句话?是这一句话吧,有不够?不够怎么办嘞? 我就要这个行不行?我就要这个行不行?好,你知道有个 print 就 行了。然后呢?来打它, 打它。那你会发现一件事,这个时候控制台,你告诉我打印结果 self 空复, self 是 谁? self 是 自个,自个是谁?零 s 零幺我是不是给你了?所以你这儿打印的应该是零 s 零幺的这个煎饼果的。那你告诉我零 s 零幺目前来讲里边内容是啥?俩字,这俩字叫什么? 独创,所以现在你的打印结果就这个位置,还是独创,听明白了不?那完事以后这个函数要干嘛? 说话?要干嘛?谈战他,他是不是已经没了?没了,哎,干什么?然后接下来该谁了?是不是该走哪个代码了?该走这个代码跟上来了吗? p 点 make 什么? master key? 我管你吊谁,我就问你一句话,那请问当走这行代码的时候,这个函数告诉我要不要进站?要要进站要进站。你来告诉我这个函数他干了什么事? 我跟那个我用粗的红的给你标,为啥呢?因为这个重点你要好好看看懂不懂。核心在这下边,你可以往下稍微压一点点啊,因为写不了那么多了,然后往下压。耶,什么玩意? 往下压?哎,差不多了。好, ok, 这个样子啊,来告诉我,现在我要走 p 点 make masterpiece。 那 么请问,那你钓谁?你是不是就地原则找自个儿的?嗯, 一开始的时候大家晕,是不是我先不写这个引力塔,听明白了吗?咱假设没有引力塔啊,那你来告诉我,他应该怎么走?是不是有个叫 master 啊? make a cake, 是 不是掉他的这个 make a cake 呀?那你告诉我一件事, master 的 make a cake, 它的底层掉了什么字? 就这个代码,它是不是将来还有个函数进站?哪个函数进站?是不是来调 master 类的?这个函数它是不是要再进站?但是我就不让它进了,因为再进我就画不下了,你看让它进站,那你告诉我,它进站以后这里边有个内容,啥内容呢?你刚是不是又把 self 传进去了?你的 self 是 谁? 还是零 s? 零幺?你是不是传到这里去了?然后那接下来里边是不是又有个三幺五?这个三幺五是不是也是零二四零幺?你的零二四零幺是不是传给谁了?是不是传给上面这个三幺五了?所以你来调调的还是你自个的独创? 哎,听明白了吗?是这个意思。那接下来我按照我的设定给你画。我的设定是什么?第一行是 master indian, 你们跟上我思路了吗? master index 是 谁?是不是意味着这个函数要进账?我就不进了?再进,我一会儿话不完了,我就不进了。那请问这行代码的 self 是 谁?告诉我 二零二这行代码,你看这不是 p 来调用的吗?所以 p 应该是零 s 零幺, self 是 不是零 s 零幺?那你这里边这个 self, 你 告诉我是谁?是不是也是零 s 零幺跟上来了吧?那零 s 零幺引力特出使化你的引力特告诉我,你里边有一件事叫 self 空腹 跟上我思路了吗?那我还是给你进一下站吧,我不进站,我怕你晕了。现在该这哥们进站了。这哥们进站以后,你告诉我,它里边有一行代码,咱出现啊,啊,出现跨一下, 这里边有一行代码,这一行代码呢?就足以。这一行代码叫什么?叫 self? 空股等于股法,哎,跟上来了吗?你告诉我 self 是 谁? cf 是 不是还是刚才的这个零八四零幺啊?所以你会发现一件事情,他居然在这里边把这个独创给干嘛干掉了,然后用谁覆盖了?用古法覆盖了。 哎,听明白了吗?用古法覆盖了。覆盖以后,覆盖以后告诉我一件事,这个引力,他这个函数,他要干嘛? 他要谈战。这哥们是不是谈战了?谈战以后,这行代码是不是就走完了?该走他的下一行了?那 make a cake 的 下一行是谁? 是 master? make a cake? self 是 不该这哥们进站了?我管你谁进站呢,我就问你一句话,这个 self 是 谁? self 是 不还是零 x 零幺啊?还是零 x 零幺,所以这个也是啊,这都是。那于是这个函数调用上边其实应该再画一个,那我来画了,该 master make a cake self, 该。这哥们进站了, 这哥们是不是又掉函数?是不是又进一下站啊?那你告诉我现在这里边掉的是谁? r g b 就 这三步,这个掉的是谁? master? master 是 谁? master 是 不是左边这个负累的?那于是你掉的还是一个 f, 是 不是运用什么什么功夫? 煎饼果子?是不还是这句话?那塞尔夫是谁?刚说过了,塞尔夫是零二四零幺,所以那一句话,你这里边的煎饼果子是不还是零二四零幺的煎饼果子?所以呢?这个地方打印的结果就变成了,来告诉我什么方法无法煎饼 古法?揭秘,他就过来了,跟上来了吗?那这个代码他不就干嘛?他就谈战了吗?这个谈战以后,那意味着这两行是不是都走完了?这哥们也要干嘛谈战?那这个战早就谈过了,这行代码是不是已经走完了?那接下来分隔键不用我画了吧? 你们还记得吗?刚才那个屁点那个,这个我刚说了,他的结果是啥?谁还说独创来着?这里边现在是不是只剩古法了?所以呢,他的打印结果就是古法, 哎,听明白了吗?好,所以现在啊,打印结果来了啊,独创独创古法古法,哎,接下来当我右键执行的时候,你会发现,那就是独创独创古法古法,哎,看明白了吗?那我现在再问你个问题 啊,来找同学提问了,那哥几个好好听啊,我要找人提问了,我要找人提问了,好好听,好好听。来了啊,上行了啊,来,开始了。 好,那么首先这里边我把这个玩意啊再写一个,这是调用负累的。这是调哪个负累?是不是调 master 负累? 那我应该再调一个负累。这个负累叫什么? define make a school s h o l make a school cake 我 是不是应该调这个副类的?理论上来讲你想精准玩,那你就做一件事就行了。 school 点 you need 是 不是抽象一下这个副类的再来一个 school 点点什么点? make cake? 然后呢?是不是把这个 self 扔进去,然后这样的话想玩哪个副类是不是就调哪个副类啊? 哎,你听好了,来,我问。逮着这个人啊,我问两问题。哪两问题呢?第一个内容就是空腹 make a cake, 然后把这个来个什么呢?来个分割线看。好啊,分割线上边这个 make a cake, 以后屁点 make a school 啊 cake 好 了,现在你告诉我这个打印结果是什么 现在这个打印结果是什么?然后然后然后我再注视一件事,我把这个注视了,我把这个注视了,就注视这一行,我右键再执行打印结果是什么。你懂就真的懂了, 你不懂就还是晕啊。 ok, 来,我就截这。其实你会发现一件事,左边这一堆你就别看了,你其实真正需要看的是不是只有这个地方啊?跟上来了吗?就只有这个地,所以左边都不用看了。来看着啊。找同学提问了 找同学提问了。然后呢?找什么呢?昨天没做反馈的那些学生。既然你不做反馈,那就是比较自信啊。代码我啥都会吗?那我现在就问问你,我看你到底会不会啊,不会就手写就好了。三遍我要开始了。来了啊 现在我没有注视没有注视我先打开让你告诉我现在的结果是什么。我在注视了你告诉我打印结果是什么。就看到这我觉得就足够了啊来了啊来了,现在是没注视。右键之行这几个分别是什么?找同学提问 啊。今是几号呀。今是四号是吧。十四号啊,好像不够十四个人。我就找找第四个同学吧。来看一下啊。一二三四等会天塌了呀。这边来 我相信可能平时都做了,就昨天没做啊。我不管你平时我就看昨天了,有的同学应该是之前都做了,就昨天没做。我不管那个我就看昨天了。对事不对人啊,不要往心里去啊。没有这对你们的意思啊。来第一个答案结果是什么? 露露馅了哈哈哈啊哈哈哈。啊我刚才瞧这个我没看呢,他提示了是吧。啊怪不得,快点快点。 没有,应该把应该去掉。你说啥我写啥。独创 好来这个独创来这个 古法这个你说完我再写它有提示 古法别说话。什么啊黑马 ai 我 就写 ai 了。好,来再来。风格线就不说了。这个是什么?我 esc 快 摁冒烟了都。 嗯?黑马黑马是吗?就是黑马 ai。 你 确定最后一次机会啊。错了,可是三遍啊。 呦,炸不住你了还来。这个是对的啊。独创独创古法黑马 ai ai。 这个没问题吧。为啥?因为你看啊,这里边每个函数执行是不是都会覆盖一下呀。对对,所以当你执行 max 覆盖了,把黑马 ai 是 不是加进去了。 好,那现在啊来看这是他的流程。就是把这个覆盖了啊,再把那个黑马黑马 ai 加进去了,为什么是这个代码干的事?那接下来呢?你看着啊,啊,来,还没完呢的话,你已经完成了一半了。好,那接下来 把马 sir 注视了,因为我一开始就说过了,我要问两个答案,现在这个答案我右键执行是什么?答对这关就过了, 你就想想有没有付成就行了。 什么?先说第一个吧,第一个是什么? 独创好, ok, 第一个是独创,第二个是什么?独创来,第三个是什么?第三个走 master 就是 走他,所以这个地方应该 是啊,古法还是独创?你确定? ok, 独创来下边儿这个地方。 独创是独创是吗?哎, ai 是 吧?好,来最后一个,这个是什么? 其他同学也可以想想看,跟你答一不一样,快点,最后一个伸一刀缩一刀,就就一下了。 a i 还是独创还是古法不变啊?不变是吧?好, ok 啊,这个答案是 对的啊,这个答案是对的啊,独创独创,独创 a i a i。 为什么?因为你就在想他走这个函数的时候,你就在想他里边有没有匿递,有匿递就拿负累的那个匿递把这个值覆盖,没有匿递是不是依旧保留就好了? 哎,跟上来了吗?所以它是一个不断迭代和复制的过程。所以说请问大家一个问题,我把这个打开了啊,打开以后咱改一个地方,那就是 master, 这就不是独创了,是不是叫古法呀?好, ok, 两个答案都答对了,所以名字我就扣掉了。 ok, 这关你就先过了,后边还有我一会再找人。 那接下来来往下看啊,我想表达意思是大家看整个这个代码的时候,那请问赋类名点功能名传 self 这个格式是不是可以实现精准访问?想玩哪个赋类是不是就访问哪个赋类?算上来了吗?那我刚才说了这个是方式几啊? 方式一,你猜稍后咱要讲谁?方式二是不要讲这个 super 这个方式二呀?方式二他就做不到精准访问了,他只能玩最左边那个,稍后给大家演示。来,我先把这个点保存一下。

一个专注于点菜材高级调试的技术博主。大家好,今天呢,有个朋友问我一个问题,说这个一个子类继承了负类的一个字段,那么请问这个字段的所有权它是属于 子类还是负类?那么这句话啊,说起来有点抽象,好,那我们来看一张图来辅助理解一下啊。我们可以看到这个代码中呢,有两个类,一个是 a 类, a 类的话呢,里面有个 id 一, 第一类的话呢,它是记整字 a 类,然后有一个 id 二。好,那接下来的话呢,我们是从慢函数中呢,输出了一个 呃, b 点 id 一,那么请问此时的 id 一到底是属于 a 类还是属于 b 类?不知道大家有没有想过这个问题啊?这个问题,呃,有些朋友呢, 可能会认为这个 id 一呢,它是属于 a 类,但是有些朋友呢,可能会认为是 b 类。好,那这个问题的话呢,到底怎么去破解呢?或者说,呃,怎么从什么角度可以让我们眼见为实? 接下来的话呢,我就用 dt 命令把这个 b 类给他内存布局给他显示出来,可以看到啊, id 已经是在 b 类的这个内存布局里面了,对吧? 呃,可能有些朋友就要问这个 id 他的片域地址为什么是零差八?这是因为零差八到零差零这个中间的位置呢?是方位表指针。 好,那接下来的话呢,怎么去显示这个 id 一和这个 id 二的值?非常简单,就是把这个内存地址给他找到啊,就是 b 类的这个托管堆上的,这个就要找到,找完之后呢,我们可以看到 id 一是十 一个是十二,那如果说你想进一步观察的话呢,可以用这个 dp 命令,可以看到一个是 a, 一个是 c, 对吧?非常简单。 好,那这个就是今天给大家分享的一个非常有意思的东西,总而言之的话呢,就是这个 id 一呢就已经是成为逼类的自断,因为继承过来的,那真的是在他的 私有区间中。好,那这个就是今天给大家分享的内容啊,下期视频再见。拜拜。

来,那么再来属性啊,还要注意的地方在哪呢?就是说,哎,我们之前说了说,当啊子类继承父类以后,那么子类可以继承父类中所有的属性和方法,那么这个所有的到底所有到什么程度呢?比如说 现在,大家注意看啊,我现在啊把子类的两个属性注视掉了啊,然后呢副类中的这个 number 啊,我给它变成 private 修饰的,看懂吧?哎,上面那个这个呢,我都给它注视掉,暂时 主要注意现在发的当中是不是有个 private 的 number 啊,私有的。那么问题就来了,那么说,那这私有的属性子类会不会继承呢?朋友们私有的属性子类会不会继承呢啊?先画个 问号,那么私有的属性既不制成啊,咱们先另说,但是我们能确定的一点是什么呢?注意看我们通常属性 private 修饰了之后,封装是不是得提供公共的盖的 set 方法呀?那么 public 找 word set set 方法的话,我直接快键 alt insert, 注意啊, out 加音色的键啊, out 加音色的键,然后呢,提供 get set 方法,对,这个 number 是不? number 提供了 get 公共的 get set 方法,对吧? 来,我们分析私有的属性继不继承啊,我们不知道,但是我们百分之百能明确的一点是,这两个公共的方法子类是一定可以继承的,对吗?对吧?因为子类继承复类以后,继承复类中所有的属性和方法, 那么这俩方法是不是肯定会被继承了,对吧?子类肯定能继承到这两个公共的 get 赛的方法,那么既然这个方法能继承,那么我们过来试试 new 一个散,然后散点 set number, 我给它设置成一百, 然后 cs out 三点 get number, 我打印输出一下,此时右键运行,看效果。 一百,说明我此类对象有没有 number, 我都打印输出了,是不肯定也有 number 啊, 因此得到了结论吧。什么结论?就是私有的属性子类继没继承啊,是不是继承了呀,只不过因为访问控制修饰服的作用,我子类要想直接用,能用吗?用不了吧, 哎,因为访问控制修饰符的作用,是不是子类不能直接使用啊?啊,不能直接使用,但是可以间接使用,通过 get set 方法,听懂吧。哎,所以说这就是第二个注意事项,叫做 啊子类。嗯,继承父类后啊,那么子类可以继承父类中所有的属性,包括私有的, 只不过因为 private 修饰符的作用,那么此类对象此类呢,不能直接访问, 那么要不能直接访问,但是是不是可以间接访问呢?哎,若需要访问呢?啊,那么使用叫公共的对吧?啊,使用啊,公共的,公共的叫做 get set 方法即可,听懂吧。哎,那这就验证了,实际上私有的属性也被继承,只不过不能直接用,但是可以间接用。 什么?这就是这个子类继承父了以后啊属性的一个特点,对吧?哎,继承中啊,私有成员能不能被继承呢? 是可以的,但但是呢,不能直接访问,要想访问通过 get set 方法。嗯,这视力代码咱们说过了啊,来,又有个练习,大家接着把这道练习。