00:00
好,打开我们的幻灯片,我们来看一下开了构造器的一个介绍,我们先看一下,在和Java一样,开了构造对象呢,也需要调用构造方法或者叫构造器,并且可以有任意多个构造器,也就是说换言之,我们的开的构造器也可以重载。即。即scan中,Scan中构造器,构造器也支持也支持重载。啊,重载这个概念我就不再多说了啊,同学们在学Java的时候知道一个叫重写,一个叫重载,必须把它搞清楚啊,那么SC的构造器呢,有两大类,第一大类呢,我们称之为主构造器,第二大类呢,我们称之为。辅助构造器这两点呢,这两个呢,到时间我们看是分别说什么啊,那么现在我们根据我们学习知识的特点呢,先来讲一下基本语法,同学们看一下这个开了基本语法是这个样儿的,前面是我们的类名,他在这个类名的后面直接带上我们的行参列表,注意这个跟Java不一样,那Java呢,它这个类名后面是不能带行参的。
01:16
但是。这个SC里面呢,可以在类名后面直接带形成我们管这一部分就是一个构造器,它就是我们的主构主构造器,那么主构造器只有一个。啊,主构造器为什么叫主呢?就只有一个啊,那么嗯,除了这个主主构造器之外呢,我们后面可以写很多的辅助构造器,那么辅助构造器它的形式是怎么写的呢?是以Z4打头。我们Java里面是按这个类的名字来确定构造器,但是在SC里面呢,它用this来表示,这是一个辅助构造器,好说完了啊,那么辅助构造器可以有多个,也就说辅助构造器可以写多个,那么它怎么来区分不同的辅助构造器呢?注意听编译器,编译器通过不同的参数来区分你是哪一个辅助隔造器,注意它这个参数可以是个数不一样,也可以是类型不一样来区分,再说一遍,就说你这个参,你这个编译器,只要比如说你有两个参数,这是这个有一个参数,这有两个参数它就区分开来了,假设你这个辅助构造器有一个参数是int类型的。
02:36
我这个也有只有一个构造器,也只有一个型参,它是实柱类型的,那么同样可以形成我们构造器的重载,啊这个这一点是跟Java一样的,好,这是它的基本语法,我们就说到这儿,那说完基本语法过后,肯定来一个快速入门,我们经常是这样学习的,对吧?好,同学们,我们呢,来创建一个person对象,同时完成初始化age和明智的属性,我们来写一个。
03:07
最简单的开了构造器来,同学们跟上老师的思路,那现在呢,我新建一个包啊,我新建一个包,我们名字就叫constructor。构造器constructor OK,好,同学们,我们现在呢,来新建一个文件,叫我就简写吧,啊,这个太长了,有时候DEMO01。同学们跟上思路,我们都能把这个干学的很好啊,就是跟只要跟上思路,一步一步的学,不着急啊,对吧,学学扎实一点,那么这个地方呢,我们就来一个快速入门,哎,现在呢,我写一个这样的类。来构造器的,构造器的快速快速入门好了,写个class,然后写一个person,写个person。A person。
04:01
Person or,那么现在人家的要求很清晰,人家的要求是创建person对象时,可以直接指定命年龄和他的这个什么呀啊名字,那肯定属性是跑不了的。啊,肯定是VR的,因为它要变化那就行,那初始化的工作仍然要仍然要做,但你也可以这样写了,说老师我用这个默认给值,这个也可以啊,这个也可以,好,紧接着呢,我们还有一个年龄,年龄呢,我可以也用默认值给他。啊,这个就是这样就写完了,那写完过后,我们现在呢,在这里给它写上两个东西,好,这个地方怎怎么写呢,直接写类型啊,大家再看这里name。找使君。都好,各位同学,当我这样一写过后呢,他立马就报错了。为什么呢?同学们看这里啊,因为你这个内蒙的名字跟他一样了。
05:00
说老师以前我们在不是可以用这个this来区分吗?因为你现在没有这个地方没有加this,它无法区分,所以在这个地方取名呢,咱们要注意一下,我一般会这样去写个in啊,就代表输入的。然后呢,我们还有一个age age呢,我写一个in age,然后呢是一个。好,那怎么把这个纸给他呢?哎,苏老师你在这写上怎么给他注意,直接这样给就可以了。啊,直接这样给就可以了。直接这样给就可以了,好这个写这个就写完了。就是它是通过这个形式把值传进去的,把这个传进去,好我们来执行一下,看看对不对啊,先看一下VRPE等于六一个person,我们现在现在先不讲细节,传东西进去了,这个人的名字叫做Jack,他的名字为20,写完了。那写完以后呢,我们输出这个东西,好,我们输出P1。那么我们输出P1过后呢,我们一执行,我们发现呢,这个就已经出来了,但是它输出的是类的这么一个信息,相当于是他把它这个哈西扣的数出来了,那我们可以怎样来处理这个呢?我们来写一个方法,把它一个吐斯字给它改一下啊,比如说我写一个方法叫DEF啊吐斯string,我们可以这样子先给它覆盖一下。
06:24
覆盖一下DEF透视罪,你看这里面就出现override,这个override就重写,我重写谁呢?我重写它的透视准方法。突出的方法,我这个时候我在输出这个对象时候,它的信息就能打出来了,好,我这样子我就直接对它进行一个处理吧,比如说this。啊,这样子信息。啊,就信息如下啊,就直接这样写吧,Name等于啊,Name等于D加上z10.name好,再加上我们的H,再加上z.H。
07:03
好,当我这样重写了这个图示string方法过后呢,我输出对象时,他就把信息输出来了啊,我这里重写了这个图示准方法,便于输出类的信息。啊,便于输出对象的信息啊,便于便于输出输出对象的信息,好同学们,我们再来跑一下看对不对。好,同学们可以看到这时呢,就输出这个信息了啊,就是名字还有年龄就输出来了,这样我们可以打一个。这个空格。啊,这个制表符,好,同学们,我们的第一个小案例就说完了,说完了,那么讲完这个快速入门以后呢,下面自然是我们的细节,这个细节很多,我一共整理了大概有这么。七个细节啊,还是有,有些东西还是要给大家反复的说一下,不然的话你肯定是不能把握的好,那么细节呢,我们放到下一节课再讲,大家休息十分钟。
08:06
好,我们来看一下,呃,继续说,那刚才呢,我们把这个开构造器的一个基本部分说完了,下面呢,我们来看一下开了构造器需要同学们注意的地方有哪些好,我们一个个说啊,我们一个个说,首先看第一个开了构造器的作用呢,也是完全对新对象的初始化。啊,构造器也没有返回值,大家可以从这个地方可以看到它的特点是已然没有返回值。这是第一个特点,第二个特点呢,主构造期的声明,就是主构造期声明呢,直接放在内名之后,那有些同学说了,说这个主构造器它到底在我们这个地方,它是怎么实现的呢。就是你这样放了一个东西过后,他在他到底看起来很怪,你说构造器肯定是方法或者是函数嘛,就是我们叫方法,但是你这写到这儿不伦不类的,好,我告诉大家啊,它是这样子的。
09:09
就是person的这个这个SC阻隔周期呢,其实它在反编译以后,它本身会把里面的这一部分代码。就是你这里面的代码整体放在它的一个构造器里面去,所以说我们通过反编译呢,可以看到它的本质是什么样子的,那么我们来看一下它是怎么做的呢,看这。主构造器会执行类。定义中的所有语句。所有语句。那这里可以提到SC的这个函数式编程和面向对象它是融在一起的,即主构造,构造器也是方法,传递参数和使用方法和前面的函数部分没有区别,那我给大家演示一下这个效果。同学们看,我在这里直接。
10:02
说出一句话是OK的。这个地方在我们甲文里面是不可理解的,就是说在这里面写话,而且你甚至可以对这个变量进行处理了。比如我加个十。那么甚至我在屁股后边再写东西都是OK的,比如说我写个OK波浪号,然后这边我们还可以打印出H,那么它到底会怎么处理呢?同学们,我们先看运行这个结果啊。当我这样一运行过后,它其实相当于把这里这里面的审批代码都要执行一遍,那么我们运行一下。我们运行一下。我们可以看到,其实它就是按顺序执行的,先打印这两句话也会也会被执行,然后呢,10A加了一个十,然后打出这个波浪号,打出来了,打出这个OK,然后把A级输出来,输出来以后,整个这个输出来以后,呃,你这个构造器就说你这句话就会导致前面这些输出,最后你调用P1。
11:05
然后输出这个图示,String,这方法里面的是不会执行的,那么它是怎么做的呢?打开我们编译器,一目了然。我们打开这个反编译器,一下就看看清楚他是怎么玩的了啊,这个本质的东西一下就看出来了。就说他实际上做了一个语法啊,做了一个语法堂,那么在哪里走呢?找到下零二,找到构造器,打开它,大家可以看到person里面做了什么工作,打开一看就OK了。哦,它原来是这样子的,同学们可以看到,在这里我们看到了一个这样的构造器。那么这个歌作奇他做什么事情呢?他其实就是把我们写在这个地方的。部分整体。包裹到了一个。构造。构造器里面,那你看这边印。In age放进去了,然后呢,Age,你看这句话,这句话就等价于我们前面写的age加等于十,它怎么做呢?它其实调用了edge这个方法获取到,然后加时再把它设置给edge,其他一类对象print print后面包括我们对这个age进行这个处理等等,都是被包裹在这里面了,因此同学们可以这样理解,同学们可以这样理解组构造器。
12:25
再说一遍啊,主构交替其实就是把你这里面的里面的类题里面的除去,除去你的函数部分全部都执行一遍。啊,全部都是芯片,仅此而已,好这个主高起的特点呢,就是这样子的啊,好,这是第三个特点,我们再看。第四个特点。那么如果主构主构造器没有参数,小括号可以省略,那么构建对象时呢?构造构造方法的小括号也可以省略,也就是说我们有时候会看到有人这么写代码也是OK的。
13:03
比如说我这儿有个A。我这有个A,那么我们在去构建这个A对象的时候呢,你会看到有人这么去写,直接这样写是OK的。来这个地方。这个地方我看看啊。呃,六六忘写忘写忘写六了六好,你也可以这样写,A2等于六一个A。啊,这样也可以,那么你也可以在这后面直接加一个小括号也可以,好这种写法大家要。注意好,紧接着我们再来看第五一个需要同学们注意指导,这里面的内容呢,就多一点了。那么这里面我们要讲的是辅助构造器的特点,辅助构造器的名称为this,这个跟Java是不一样的啊,因为Java的其他的构造器也得给类名相同,但是它叫Z,多个辅助构造器通过不同的参数列表进行分呃去区分,在底层就是Java,就是类似于啊,在底层就是这个,这个叫。
14:09
那底层就是方,就是就是什么呢?就是构造器的重载,我给大家演示一下,那同学们我们就以这个person为例,我们再写几个辅助构造器。啊,辅助各个起来整一个DF,比如说我现在写一个这样的东西干什么呢?我这次只是初始化它的。他的这个年龄名,名字你看我怎么写。名字找是最。好的,写到这,然后呢,我这就可以写this了,大家看我写this.name等于name,当我写完过后呢,这个代码是错的。那为什么这个是错的呢?好,同学们,有一个需要同学们了解的地方,就是辅助构造器,辅助构造器要求它的第一句话必须调用。
15:04
我们的主构造器啊,这里面我写上啊辅助构造器。辅助啊,这个辅助。构造构造器必须啊,必须在第一行,必须在。在第一行,在他这个辅助勾的写第一行调用,或者叫显示的调用。显示的调用。显示啊,这个这个显示,这个是显示啊,显。显示哎,这不出来应该是这个,诶显示显示的调用这个主构造器。主构造器。主构造器,那也就是说你要写这么一句话。啊,你就写这么一句话。他再看我这样写了过后呢,这个地方它就没有报错了啊,这个储构造句,我们这个地方应该怎么写呢?这样你还要还要给他传一个,这样我运行一下看看能不能对啊,这个类你没有没有对应的参数啊,这个地方应该是要报错的。
16:12
啊,应该报错的,应该这样写,把这个名字再传进去一下。啊,把这个名字再传进去一下。比如说我们传了一个Jack啊,再给他传一个。年龄啊,这样子这样子呢,我们也可以用辅助构造器来进行这个处理了,我们先来运行一下同学们。好这样子啊,这样子我们来运行一下看效果。看效果,我六一个P2等于六一个person,好,这次呢,我只给他传了一个汤姆,那么这句话会干什么呢?这句话下面这句话,这句话就会就会调用,调用这个辅助构造其他。啊,调用这个辅助构造器。然后调用过后呢,我这里调用了主隔造器,主构造器里面相当于把这个代码又走了一圈。
17:06
啊,把这个代码又又走了一圈啊,走了一圈过后呢,我们把这个名字又给他了,我们来执行一下,看这个效果怎么样啊,为了不让这些给我们冲突,我们先把它。注销一下,好,我们来运行一下,看这个结果print。我们输出这个P2,好,我们看这个结果是什么样子的走。啊,走一下。啊,运行过后呢,我们可以看到这个结果,它是这样子的。我们来看这个流程是什么样子的啊。首先你传了一个内容进来,然后呢,我调用了这个主构造器。呃,我把我写死了,写了一个Jack,写了一个Jack过后呢,同学们可以看到,呃,这这段代码会相当于干什么呢?这段代码相当于他会去执行。这里面的部分就是执行这个高亮的部分和这一部分代码,它会走一圈。
18:02
因为你调用它了嘛,调用它过后呢,他把这个name和age传进去,那这个地方传的是Jack和。十,然后你把这个A值又加了一下,这个A级到这呢,就变成20了,变成20过后呢,又打印这个波浪号,波浪号打印过又打它,打它啊这个方就输这个A等于20,就这么来的,然后你这做完这个组构造期的事情过后呢,你又把这个name交给了,又重新复制了。哎,又重新复制了,对吧,重新复制。重新复制,那么重新复制以后呢,这个地方又被改成了你真正传进来的这个汤姆,所以说最后这个就变成汤姆了,就这么一个流程。那有些同学老师,那我如果没有这句话会怎么样呢?你他说你这样写有什么意思呢?看,如果我没有这句话,首先可以看到。语法是过不去的,我们看他报的错误是什么?
19:00
他直接报这个语法错误,语法错误,当然同学们可以看到,刚才我写了这么一个东西,他语法也过去了,对不对,然后呢,我再执行一下看,如果我这什么都不写,那么我们看执行的结果是什么样子的走。好走一个好,直接将其报错,为什么?他说你这个方法我不知道是什么,看到没有都overloaded。Overloaded装载这个方法的时候,他说找不到,那也就是他也就是说你这个地方并不是主构造器,因为你主构造器有两个参数嘛。你有两个参数嘛,所以说它不允许,它不允许好,这就体现出这个一个特色,就是辅助构造器必须在第一行显示的,要调用辅助构造器。必须在第一行呃,显示的调用这个阻隔器,那么有些同学可能就要问了。这个地方要讲往里面讲,它它其实涉及到这么一个原理,我说一句,大家看看能不能听懂啊。
20:04
看能不能听懂,他为什么要去调用这个,就是在这个SKY设计者,他为什么要去调用辅主构造器呢?其根本原因,其根本原因它要去实现调这个主构造器的时候,能够去实现调主构造器的负类。的构造器。你们回忆一下,同学们,你们回忆一下在Java里边有没有这样一个逻辑,在Java里面我们去,呃,去这个写的所有的这个构造器的时候,其实它有默认有一个super。它会掉负类的一个构造器,因为呃,没有这个东西的话,它就会报错,只是它是影视的,那我们这个person将来你看我写一段代码,你们就立马明白是为什么了。你比如说我在这里,我我不写到这了啊,我重新单开一个文件,我们来理解一下为什么他要去调这个东西,好吧,我多说两句,好,我新建一个文件吧,不跟他打架,打架了东西太多了,我们放到一起呢,容易产生这个混淆,那同学们我简单的说一下,他为什么要去调这个主构造器呢?
21:18
好,同学们注意听。啊,DEMO02啊,这点可能是有些面试官他会问一问的啊来吧,咱们写一个类叫A类。Very good,然后呢,我在这里,我在这里啊,注意听,我在这里注意注意看,假如呢,我这里有一个。组胺数,我在这里呢,构建了一个A的实例。A的事,这个这个我相信同学们都能看懂,特别的简单,特别的简单,那么我跟大家写一个东西,看看大家能不能理解class。Class b。克拉斯B。B,好的好的来。
22:04
那么class b过后呢?我在这地方说了一句话过去,比如说是B。波浪号。我在这呢,输了一个什么呢,输我写一个辅助构造器。我我写一个辅助构造器啊DEF,那么随便咱们就写一个吧,随意一下,比如说我这里,呃,传入了一个name啊,就就随便写一个同学们。啊,随便写一个。好,然后这个地方呢,呃,我们看直接就报错了,他报错的原因就是因为你没有去调用。主构造器,所以说这门写上这个Z它就OK了,这样就调调用什么呢?调用这个A的主构造器。主构造器。主构造器啊,主构造器没了,那现在呢,我们我们在这里面打出一句话,同学们注意听我在这打了一句话叫做A这个里面的这个方法。
23:04
好,这个就写完了,写完过后呢,同学们可以看到,当我去调用现在啊,同学们看,当我去调用这个,去构建这个A对象的时候呢,他肯定会说出这句话。说出这句话,那现在呢,我为了让大家看到这个效果呢,我直接让这个A去继承了这个B。继承了这个B,那么它会怎么样呢?来,我们看输出的形式是什么样子的,走一个代码。我们可以看到哦,这个A它说已经有了,那就加一个AA吧,好吧,这边改成BB。这边改成BB好,这边呢,我改成。A,好,我们再来跑一下。泡一下中。哦,跑一个过后呢。这哦,这这个地方是刚才那个错误对吧,这是刚才那个错误,还还没办法,还还没有调过去,好这样子再来走,因为它会整个编译你的代码,好这个时候大家看效果。
24:04
同学们可以看到,在这个地方。在这个地方,我们去创建这个A的时候,B这方输出了内容。你看这这里,因为你在这去掉这个this的时候。调这个this的时候,它会干什么呢?我们这同学们看我们这个地方调这个A,我们在调A的时候,它默认其实是调的这个AA的主构造器的方法,大家看看懂没有,就是其实它是这本身有个小括号嘛,那么小括号它调这个AA的时候呢,它会顺带的去调用你这个AA的副类的这个阻隔造器,因为你这其实它默认这个也是有个东西的,相当于这种感觉。大家看这样大家应该看得很清楚了,就是说它在构建这个AA实力的时候,你调的是阻隔造器。那调用阻隔造器呢,你这个地方又继承了BB。
25:00
那么这个时候其实他会走这个代码。那同样的道理,同样道理。如果我现在写上。这个叫做Jack,那这条线就走到什么,哪条线呢,因为你要现在大家明白了,就说你看啊,刚才我什么都不写。他其实在只在去实现这个A的时候,他会先走BB的。这个足够的气。那同样道理,如果你辅助构造器没有这个东西,就会出现一个很可怕的现象。如果你真的没有这个东西,那么大家想一想。这个逻辑就讲不通了。为什么讲不通呢?因为如果说你这个语法是成立的啊,同学们,假如我们这个语法是成立的。就是他不报错,那反而这个编译器的语法是讲不通的,为什么?因为我通过这个辅助构造器能实现,那么我这个辅助构造器在。
26:00
再去实实体化这个A的时候,它跟父类的关系就。断掉了。它跟这个副类的关系就断掉了,所以说他要求我们必须先去调用这个阻隔器的根本原因,注意听这句话,根本原因就是要去实现你的这个子类跟父类之间的一个。继承关系,如果你没有这条,没有这个东西,那相当于什么呢?你执行它打印出来就走了,而且对象还出来了,那问题在什么地方,你这个BB。他的负类怎么办?他负的这个构造器你就吊不起来了,那同学们在学这个Java的时候,是不是老师也讲过,我们去。实现我们去实例化一个子类实例的时候,其实父类的那个那个默认的那个构造也会被调用,这个原因其实是完全一致的,那么我把这个打开大家看一下,这样子它就不会报错,我们再执行一下看效果啊,如果我这样走的话呢,它是先怎么办呢,他先要去。
27:03
执行这个组构造器。主构造器,执行这个主构造器的时候,它优先执行这个BB的这个里面的这个构造器,那你你这写的是。这个BB不就主要剂是它吗?其实相当于这个感觉。好,那这个顺序我们来看一下啊,假如我在这写一句话,我们看输出的顺序是什么。我们看看输出的顺序是什么,我们来溜一圈。好输出的顺序,顺序是第一步。第一步,首先先输出B波浪号。没毛病,紧接着输出我们的AA。OK,好,紧接着第三步才是去实执行我们辅助构造器里面的这个方法。好,这个流程大家看到了,其实先是执行负类的。
28:02
再次执行我们这个主构造器的,哎,同学们,再次执行我们辅助构造器的,对不对,辅助构造器辅助辅助啊辅助。辅助构造器,那刚才呢,老师也讲了,就是为什么是这个逻辑啊,其实其实他是仍然沿用了我们Java的这个这个机制,所以说为什么要讲这个,因为要把这个讲清楚,我没有办法不提到这个继承。而且同学们也是有基础的,应该能听懂,如果如果这个地方不不提到这个继承,你是根本不明白为什么一定要调调Z的,因为你没有这个Z,这个辅助隔断器,没有去调这个主隔断器,那么我们这个地方的线就断掉了。而且很可怕的是什么呢?可能有些同学认为说老师。那为什么scanner它不支持在辅助构造器直接调这个BB呢?调不起来。因为在开了里面,它对这个语法做了一个简化,什么简化呢?它不允许,它不允许在辅助构造器直接调用户内的。
29:12
构造器,所以说你看这个地方,你如果这样去写它也是不成立的。注意看。Super。So。代码直接报错。你们还记不记得这句话的含义是什么?在学加号的时候,老师讲过super括号其实就是调用我负类的一个构造器,如果这面有参数,你这这个什么,这个地方是不是决定这个地方是不是决定调用,调用哪一个负列的哪一个构造器,老师讲过这个没有,是不是这里面这个参数决定调用负列哪个构造器是吧,但是在SC里面它不允许在负这样调用,所以说这个没用,所以说这条线呢,就必须这么去写。好了,同学们,这个我就先讲到这儿,我们先板述一下啊,讲的有点多啊,我们。再来看一下这个东西,那么刚才呢,老师说了一下这个辅助构造器的一个概念,但是讲的还不够全面,我现在把这个案例整体拉过来,重新再给他过一遍,大家就清晰了,来我重新写一个文件,这个地方呢,还有点细节,把这个讲完我们就做一个整理啊,来同学们再加强一下这个辅助构造器的说明。
30:24
啊,我慢慢慢一点啊。卖点DEMO03。好,这个说完大家就彻底的明白了,来吧,我把刚才这段代码,整个这个代码给大家拿过来。好,整个代码拿过来,大家看这段代码呢,应该是,呃,我看看。拿拿多了啊,这边从这来。好,来同学们,我们看一下这个逻辑,看看同学们能不能理解这个东西啊,来走一下,首先看一下老师的代码。看下老师代码,首先呢,我这里我这里定义了,定义了一个person类。
31:02
没毛病吧,然后这里面呢,我写了一个阻隔到器,这个阻隔器就是默认的,我也没填参数进去,这个没毛病,然后呢,这有两个。属性都能看懂。都能看懂,好,紧接着这个代码里面呢,我整了一个辅助构造器,这个辅助构造器是呃,接收一个内蒙,然后在这里我直接调用了主构造器,因为没有这个东西,立马报错。刚才原因我也说了一下,为什么要调他,因为从他这个机制来说,他要给他的腹内留一个。入口啊,所以说这里吗。必须要写上,写上过后你看这句话,我写的是辅助构造器,无论是直接或间接,最终都一定要调用到主构造器。刚才我在这说了这样一句话呢,不够严谨,我在这说了这么一句话,不够严谨,我说了哪句话呢?我说这里,我在这说了这么一句话不够严谨,我说必须在第一行显示的调用构造器这边应该再加一个句话,就是可以是直接,也可以是间接。
32:08
可以是直接,也可以也可以是间接啊啊稍这稍微有点绕啊,间接,但但我尽量说清楚,可以是直接也可以间接,我回到这边来。你看这里我说了这句话,说最终都一定要调用阻隔调器。执行主构造器的逻辑啊,而且需要放在辅助构造器的第一行,这点跟Java一样,Java中辅助构造器调用类的其他方法也要放在第一行。大家回忆一下Java的代码,诶,我问大家一个问题,你们在学Java的时候,老师有没有讲过,如果我这个Java要调用我这个Java一个构造器,要调用我同类的另外一个构造器,我是怎么调用的?还记得吗?是不是用那个Z是什么哦,我写一下啊,这个是你们Java的基础啊,同学们这个是Java基础,就是在Java里面是不是我我有一个Java有个构造器,我要去调同类的一个构造器也要放在第一行啊,老师是应该讲过这个东西的,如果你不放在第一行,它会报错,是怎么写的呢?大家还有印象吗?
33:14
我简单写一段啊,讲到这我简单说一下,因为这块稍微有点绕。我提一下啊,DEMO,大家跟上我的思路,老师在回忆的时候你就一定要。注意了啊。啊,你你你们回忆一下当时老师是怎么讲这句话的,比如说我这有个A类。比如说我这有个A类,那么这里面呢,我这个A已经有了,我就写AAA吧,三。AA,好三个A,那么我这里写个构造器,同学们注意看public。Public。Public a public AAA,好的,同学们学写完了。这个就是一个构造器,我再写另外一个构造器,同学们再写一个构造器,AAA还是构造器,但是呢,我这边要让他接收一个字符串,比如10G。
34:05
Australia name没毛病,这个写完了,那现在我问大家一个问题,比如说我想在这里。我想在这里调用调用这个AAA这个构造器。我要在这里调用同类的这个这个构造器,就是说我我我我想去调这个构造器了,我想用它一下。那么同学们看一下,是不是老师以前讲过,是这样写的?假如我这儿还有一句话啊。同学们回忆一下。假如我这里还有一句话,我我我要调用这个,在这个构造器里面,要调这个构造器,当时老师应该说过必须把这句话写在哪里呢?是这样调的吗?不是这样调的,不是这样调的,而是在前面写成了this,还记得吧?哎,这样子的,而且这个句话必须放在第一行。
35:00
你如果不放在第一行,你放在别的地方就是错的。而且同学们还记不记得老师曾经讲过一句话,就说在这地方,其实它默认会掉一个super。是不是有书本,但是两个不能同时存在,为什么不能同时存在知道吗?因为你在这调这个的时候,这个地方它是默认有个竖排的。能能能理解了吧,所以说我们这个规则就被沿用到了里面。就是说我们一定要有一句话去实现掉负类的一个方法,那么不管你是直接还是间接,所以说这个地方呢,其实其实就是这个逻辑啊,其实就是逻辑说你这个地方一定要写的第一句话,好,那现在这个地方呢,我们就把这个去掉就可以了,好回头我们再来看刚才这个逻辑,相当相对来说就比较好理解了,说你看为什么我一定要把它放在第一行呢?就是因为你这个认识的主构造期里面其实也隐藏了一个,在他这里隐藏了一个super,所以说这个就成立了,好,这是我们的第一种逻辑,没毛病的,我们再看第二个逻辑,第二个逻辑呢,我这里写了一个辅助构造器,辅助构造器。
36:13
构造器,那么这个构造器呢,它可以接收两个参数,没毛病,所以说我这也写了这个意思。你如果没有,这句话仍然报错。老规矩,好,原因就跟刚才说的一模一样,紧接着呢,你看我这又做了一个动作,我做什么动作呢?诶,我这里去接收一个age。我接收一个age呢,我去调用,如果这句话没有肯定又报错,那么我这写了个this,匿名,好,有同学就要说了,老师不对,因为你这个Z传了一个字符串,它其实是调用的这个构造器。并没有调你的阻隔造期啊,但是你不要忘了,因为你在调它的时候,它里面去调了这个阻隔造期,因此我这说了。
37:00
这个调用主构造器,它其实呢,也调用主构造器,是因为你的这个这个这个辅助构造器中调用了主构造器,因此它本质也是调用了。这个Z阻阻隔热器好,所以说我这讲的这句话啊,就是可以是直接调用,也可以是间接调用,最后代码就写完了。大家看这个能不能理解,而且我也讲清楚,为什么一定要调这啊,它的本质其实是有这个继承的,这个隐藏了一个继承的这个逻辑在里边,只是藏起来了,只是藏起来了,好了,同学们,我们把这个代码运行一下,大家看把这个代码再看一下,我们这这个事就说完了。啊,这个事儿就说完了啊,同学们。Person稍微有点啰嗦对方,好,我现在呢,给他来一个。啊,来一个这个这个代码啊好,同学们看到这里面呢,我们给他传一个啊这容为什么报错了。Person。
38:00
Person。啊,我给他传一个值进去吧,不要传一个name。好,这个就OK了啊,这个就OK了,好,现在呢,我们来跑一下,我们来跑一下,看看这个整个运行起来以后,它这个地方的这么多构造器一共生成了几个,我们来问大家一个问题啊,运行后。运行后这个person。Person底层。一共生成了几个构造器?我们来看一下,然后把它代码拿出来,漏一就可以了。person有几个构造器呢?构造器呢,一共有一个辅助的啊,一个组的两个三个四个啊,也就是他一共有四个构造器。四个角,好,我们运行一把。同学们注意听啊,这个马上就过去了,诶这个有错误啊。他说什么玩意儿,他说这个person定义过了,我没定义过呀。是哪整的一个person啊,那那就这样子啊,我这个就改一改吧,改成这个PERSON2好吧,PERSON2我改一下,不然的话这个过不去啊,过不去我是说刚才这个地方为什么现在这样想,这个还还报错了是吧,其实其实是因为那个类名重复了啊,类名重复了好这这个其实也是可以的,因为我有四个勾到就选我想用哪个我就用哪个嘛,对吧,好我们再来运行下。
39:23
好,这是我们看PERSON2。好的,同学们看没毛病,那现在我们看这个PERSON2是不是一定一共生成了十个构造器啊,然后他们的关系是怎么形成的,看一下底层代码咱们就过了,好同学们打开我们这个工编译工具啊。有点啰嗦了,好,我们把这个刚才PERSON2打开,就看这一个,好,我们来数一数吧,首先这两个属性不不管它了,这是第一个,这个是这这个不是啊。这这这个是第一个,这个是默认的那个,呃,就是那个默默认的那个主,这个是主隔造器,还有看这这个是一个时寸,然后我掉this了,这个this其实掉的就是它看到没有,诶这个大家明白了哦,这个S掉的它不就是跟我们加号一模一样吗?哎,紧接着呢,下面这个PERSON2呢,有的它有掉了this,其实也是掉掉了这个阻隔到器啊,因为你这个this掉完了过后,这里面这里面就是在一个PERSON2里面是不是隐藏了一个per super啊。
40:23
但大家还记不记得这个,就这个地方。就是你们看到的这个地方。这个地方其实它隐藏了一个super,是不是把那个也也也搞定了是吧,他隐藏了个super,所以说这个继承关系就就又出来了,好紧接着我们看d d person2 person2呢,没有调这个,调这个主格器,但是它调这个匿名了,它其实走的是这。好,其实走到这的话,他就把这个代码又走了一圈啊,走了一圈好,这个四个就逻辑关系就出来了,好同学们关于我们这个构造器辅助构造器的特点,我们就全部说完,那么我们进行一个简单的板书啊,同学们好,现在我把这个整体的跟大家板书一小把。
41:06
来,我们把这个地方阐述一下,呃,刚才我们讲的是Java构造器,现在呢,我们把辅助构造器的逻辑给同学们走一下,怎么突然变冷了,是开了冷气了吗?你们冷吗?不是,他是开冷气还是开热气了。
我来说两句