00:00
好,这个一般性的solid我们就定义好了,我现在又有新的需求了,什么需求,我现在想让这个萨soli。Some,这个。对象在初始化的时候,我输出一句话。说出一句什么话?随便我比如输出一堆等号,就想实现这个功能的。那怎么做?这样我们。把这个删掉,还给大家留下来啊。零九。
01:01
初始化,那初始化,它初始化的时候,那大家想想那怎么做,那我们马上能想到的。那就是它了,这个以内的方法是不是。这个内的方法,那我要加到这儿行不行。加到这行不行,肯定行。行不行?可以吧,肯定行,但我们不能这样写,为什么?这是个一般性的。你加到它里边就意味着什么,以后你再定义other third,其他等等所有的它都会执行这句话,那我现在就要求some就这一个。
02:13
初始化的时候需要输出它,所以不能这句话肯定不能往这儿加,那加到哪呢?哎,有同学马上想到了。讲到这儿。我们在这把这个引力的方法是不是给它重写了就可以了呀,是不是子类重写父类的这个引力。哎,我给他重写了,然后粘过来,这是不是就可以了。加先这样行不行?那你想一下呗。那么你在初始化,你在创建这个对象的时候。创建这个对象,我们想的生命周期,创建这个对象就意味着要调用它的。
03:06
无参构造器对吧。调用无参购器调用完了,紧接着是不是调用它的引力的方法。都要一定的方法,是不是马上就执行这句话了?对不对。所以这应该没问题吧,OK了,好。诶,刚才重新发布过了啊,刚才已经重新发布过了。这样吧,让大家看着我又重新发布了啊。那我们来看一下。能不能像我们想象的那样?看着。走。Ya。坏了。什么?空指针异常。哪儿空指针了?他说了,GENERIC43号空指针。
04:00
GENERIC43号。诶。这空指针了,这儿空指针,大家想想。唯一有可能的是,谁是空?只有怎么样才能报了空指人一偿。对于这句话,43号。只有config为空的时候。他这儿才会报了空声异常。这是个闹对象,闹对象调用方法肯定要控制人异常啊,也就是说convi是没有的,它为什么能没有呢?Config这儿不是有了吗?诶,又有个问题,In,这是gene里边,你再看看这个some里边也有个in,那就是说。
05:01
也就是说这句话到底执行了没有,这个到底执行了没有。这还真不知道,这样我们给这输出一下。我说说他,我为了让他不报控制人异常啊,你注意我把这儿的代码。我把这儿的代码注释掉。这样它就播报控制异常了,我们看看它运行的情况。这个东西能否输出,这个东西能否输出。太阳春发不过了啊。走诶不报错了吧,看一下。是不是直行等号了?也就是说这个init执行了,是不是这个没执行啊。
06:04
为什么呢?为什么他没执行呢?那我们得分析一下了,注意啊,我现在讲的这个地方就比较难了,你得认真听。大家想想啊,我们在想生命周期,首先你要创建这个对象,你创建这对象,它会。是不是调用这个方法的无参构造器啊,不是这个呃类的无参构造器啊,调用了它的无参构造器,紧接着是不是调用引力的方法,是不是调用它了,调用它的时候,你注意我们他们开的服务器会将。外边的叉里边关于这个S的注册信息抽象为一个solid config对象作为行参,作为食参传递给这个config行餐,也就是说这个config现在就有值了。
07:01
这个config有值了,关键问题是他有值了,你接收了吗?没有。没接收能有值吗?这是第一,第二我们通过刚才的运行知道这个引力的方法根本就没运行,这个没运行,而你43行的代码。其实就是现在44行,因为我给这加了个,呃,给这加东西加了一行这个代码是吧,就这44行,44行这个。com是谁是成员变上这个config呀,这个config的值来自于哪,只有你调用它的时候。它才会有值,只有这个need的方法被执行的时候,他才会有执,现在他执行了吗?他没有执行,没有执行就意味着这个con菲是是now。他是now。
08:01
那怎么就执行了呢?我不知道咱们大家留意了没有。我在写这个以内的方法的时候啊。看着我把他删掉。我在写这个init的时候,人家出来是不是这个样,我直接上来,我是不是还把它这样粘这儿了。我是把这句话给删掉了,哎,大家现在应该明白了,你现在应该清楚了。怎么能让他执行?我写上这句话,这是不是调用负类的引力的方法?那不就是她吗?对不对。他就调用他了,一旦调用了他了,这个con菲是不是就执行了呀?那这个是刑参的值来自于哪?你注意是他们开始传给他的吗?
09:07
不是啊,是谁?是这儿穿过来的,这是时差。对不对,这是食餐。传递给了这个,而这个conflict来自于哪?来自于这儿。这个参数的config值来自于哪?是汤姆给他传过来的。OK,好,现在我们重新运行一下。他他自自己啊,自己发布过来又。走。看到没,是不是运行了,那这样的话。我现在在运营它。就不会有问题了。好,我们。走。你看没问题了吧,这就OK了。
10:04
这就OK了,也就是说以后你记着。只要你定义的。需要重新引力的方法,记着啊,这句话可不能删。这句话必须在这放着。否则你的config。就会出错,就会报空指针异常。记得了没有?记住了吧。我跟你这样说,转脸你就忘了。这种方式不好。我给大家说这种方式不好。为什么程轩容易忘这句话?那怎么办?你得从代码上。把这个问题给他解决了。让程玄忘不了。那怎么做呢?我们修改。
11:04
怎么修改?我就在想啊,你不是要重写父类的吗?我能不能让你这样呢?我不让你重写这个代餐的in,我再给你一个init方法。Public void in,我大家看这这这什么意思啊,我现在是不是。这叫什么,是不是重载呀,我是不是重载了一个引力的方法。这个一定是干嘛的,我加个注释改午餐。Init方法就是要让子类来干嘛,重写的。
12:02
就是让他重写的。然后呢?然后这样写。哎。这啊。以。调用无餐的。In方法。也就是说这个代餐的。是不是掉下来,这个无参等于。呃,有同学就说了,这这这你调用它,它里边什么也没有啊,这有意义吗。你看一下,你看一下有意义没有啊,我这儿重写,我重写谁。
13:07
重写父类的无参盈利的方法。你看到没?我把它删掉。我这个里边是不是有这个输出等号啊。对不对。我这个里边什么东西也没有,那现在我运行。我现在运行啊,你说它会运行什么,这又重新发布了啊,会运行出来什么结果。这个会不会输出。这个又会不会输出呢?估计咱们有的同学开始迷惑了,这个隐掉的是明显是他,不可能是他呀。
14:08
那我们看一下呗。走。我们看。诶执行了没有,他执行了呀,这怎么回事儿呢?他怎么就执行他了,为什么没执行他呢。其实这个问题你不应该问我,你应该心里边很清楚,这是原来Java基础部分的内容。那么这部分内容我给大家回顾一下。它是怎么做的呢?70啊,大家来看这个in是不是相当于是不是这样写的呀,this.in吧,对不对,这面向对象编程里边的方法,对方肯定是。
15:02
前面是有对象的是吧,但是不写,那省略的就是this,它实际上是this.in。而我们大家知道,我们的代码的执行分为两个时期,一个叫做编译器,一个叫做运行期。对吧,编译期和运行期。那我们先来说它。先来说啊,这里边儿涉及到的东西就多了,这刚才先说了一个编译期和运行期,这你应该知道啊。那这样我把这个编译器运行器的问题先给大家说清楚了,那么编译器。this.in这个in方法看的是谁?系统看的是谁?系统看的是这个方法。就没内容的这个方法。为什么编译的时候他就看。
16:01
他是进行语法检查的呀,他就看一下这个方法的调用者。那不是this吗?这个对象所属的那个类,它所属的类是谁?是不是general solid?里边有没有一个方法。是无参以内的,有没有啊,有有语法是没有任何错误的。编译通过。这是编译期。那运行机呢?真正运行期。他要看这个内的方法的调用者对象是谁。他要找到这个对象的,注意是这个对象的可不是这个类,是这个对象的当前对象的in need方法,当前对象是谁呢?有同学说当前对象是JA啊,你创建它了吗?
17:08
没有啊。没有给,哪能有gene的solid里特呢?那你现在有谁呀?你现在只有萨姆里。怀了,但有同学又开始糊涂了,这,这是怎么回事?又跑到萨姆里去了,诶,这时候就又涉及到了。我们对象的创建了。我们现在回顾一下对象的创建是怎样的。我给你个对象,这样啊,我给大家画个图。嗯,画个图,那我问问大家啊。我们new出来的对象都在。虚拟机的哪块内存里面放着的呀?
18:00
对,在堆存。这是什么?是gdm的堆内存。这在堆里边呢啊,堆里边放什么?我们回顾一下堆里边放了什么,就放了六出来的对象和数组。好。我拗一个对象,我拗一个子类对象。我NEW1个子类对象。哪个子类?我现在就拗这个萨姆这个子类对象。那我们大家知道它会调用是不是some无参构造器啊?可是你知道调用这个无参构造器的时候,它底层做了一些什么工作吗?他在调用这个无参构造器之前,其实做了很多工作。什么工作他先要。
19:05
查找当前你要创建的这个萨so的父类是谁,他要找他的父类。一找或者是谁啊,Gene。哦,Some负类对象是尖。然后呢,然后继续找,再找jeica的父类是谁。他的父亲是谁?就我们自己定义这个类啊,我们知道它没有负类,没有负类就意味着什么,它的父类是object。好了,找到根儿上了,找到欧巴了。然后做什么?然后要做的工作大家看啊大家看。
20:02
我给这儿。这是我要创建的那个some solid对象。他首先会在这儿。创建,或者说他在这儿会调用。调用object的。够大气。创建一个。内部object对象,你注意为什么是内部,是内部,是我们some这个对象的内幕。创建一个内部object的对象,紧接着呢。继续。改价。
21:05
它会调用JA Rick的无餐构造器。创建一个。内部generic对象。这也是个内部的啊。再然后呢?再然后,才是真真正正的。给这儿。调用some solid的五层。
22:01
哎。午餐。构造器调用萨的无参构造器创建,诶,创建当前的this对象。就是我们当前这个对象啊,当前这个对象不是this吗?创建这个对象。所以这个对象是谁?向solita。对象,这是我们那个some。对象。这它的内存,内存里边分这样的三块。而这三块里,不管哪一块,你注意这个this始终是指的就这这里边儿所有的东西都叫this。
23:06
他都叫this。好。那有了它了,我们现在再来说。先了解了他啊,这首先这有一点,这就为什么我们之前。啊,很多老师给大家讲课的时候就说了啊,你记着啊,给一个类。给出他的代餐构造器,一定要给他无参构造器,为什么就怕这样,你让他要当副类的话,如果没有无参构造器。那在创建子类对象的时候,他会报错。它默认调用的是负列的无参构造器,你看加萨如果没有无参构造器,它会报错的啊好,这样,这个图我给大家存下来。沉下来。嗯。
24:06
Cos。对象的创建过程,好,那有了这个图了啊,我们现在再来说说什么。当我们要创建some对象的时候。是吧?那我们已经知道了,它已经内部是不是创建了generate solid创建了那个object是吧?Object我们这个就不说了啊,创建它要调用它的无碳构造器,调完无参构造器紧接着要调用谁。要调引呀,你肯定要调引的方法,他自己有引方有同学说有啊这个方法。服务器是看不见的。他只能看见哪个方法,只能看见代餐的这个init。
25:01
那我问问你有没有那个代餐的盈利的方法。有同学说没有,没有吗?他继承自他,他里边有就意味着谁,是不是他也有啊,他肯定有,就这个东西就是他。所以我们弹不开的服务器会自动调用这个引力的方法。调用这个引力的方法,这个引力的方法。执行。执行,那我问现在这个z.init在编译系的时候,我们知道它肯定是。找的是这个对象所属的类有没有无的有有语法不报错,可现在我说的是运行,运行的时候你说这个类似谁。你说这个Z是谁?看这个this,你说this是谁?
26:00
不管是谁呀,这儿只有一个对象,就是萨斯。就是萨姆里。所以。This in调用的是谁?Some solid的,所以调用的是这句话。明白了吧,这确实有点儿难。那这个我不知道咱们大家是否理解了,也就是说以后我们再定义再定义啊。就就是这样写的,我这儿有个无餐的。然后呢,让这个代餐的调用了这个无餐的。
27:00
这样的话,我们这个general就比较完整了。那么在这儿如果啊,我刚才给大家讲的这个过程,你要不是很明白,大家可以参考。有Rico,有我Rico。主编。由清华大学出版社。出版的。Java零基础教程。那么那个里边比较详细的介绍了这个过程。嗯,大家可以参考那本教材来看,当然里边也有视频,相应的视频啊,好,另外呢,给大家再说,这也是一种设计模式啊,你注意它。不动,这儿定一个这样的无参的,让子类来重写,这也是一种设计模式,叫什么?
28:04
这种设计模式叫做模板方法设计模式。它叫模板方法,也就是说这里边儿的步骤一步一步是什么都不动。我已经规定好它的步骤了,只不过这里边具体的像这个in它是什么,那么不是由我自己来决定的,由谁由子类来决定,由子类来重写。给子类以扩展空间,但这个东西你不能扩展。这就是。模板方法设计模式。所以这里边啊,涉及到了两种设计模式。那么这个就是我们模板方法设计模式里边的模板方法,这是模板方法设计模式好。关于以内的方法,它是个难点。
29:03
嗯,希望大家能够好好理解一下。
我来说两句