00:00
接下来呢,我们再重点介绍一下构造器参数的一些特殊的用法,那其实前面我们也已经看到了啊,在定义构造器的过程当中,补助构造器的参数其实非常简单,这就相当于是一个函数的参数嘛,一个方法的参数,我们只要把这个名称和类型定义出来,然后接下来拗这个当前的对象的时候,把对应的参数传进去就可以了。那这里边的主构造器呢,我们之前是无参的,是空参的,所以这里边可能也没有看到到底应该怎么传参,那大家自然想到了,如果主构造器传参是跟辅助构造器一样,也是直接把对应的这一个定义出来放到这儿就行了吗?哎,那这里边有一个问题,就是我这里边如果直接把name和age放在这里的话,我下边又要定义属性name和age,这怎么样区分它们呢?啊,这就乱了呀。哎,所以这里边大家要注意一下啊,对于这个主构造器的参数有一些特别的,一来看一下主构造器的参数。
01:04
可以认为是一个函数,也就是构造方法的行参,它其实可以有三种类型的,一种是可以不使用任何的修饰。那就没有任何修饰符修饰的时候,那就相当于我们这里边辅助构造方法用的时候的这个参数一样啊啊就是一个名称和一个类型,那这就相当于只是一个局部变量。而另外呢,还可以用修饰符来修饰,修饰符就是VAR和va,表示可变的或者是不可变的属性,大家要注意就是只要这样一修饰的话,这就不仅仅是一个行参一个局部变量了,它同时可以直接作为我们当前内部的一个属性来使用。B,用了这种方式的话,下面我们就不需要再去定义属性了,这样也不会起冲突了啊,所以接下来我们在代码里边来做一个具体的测试,看一看到底是怎么回事。
02:04
还是new一个SC的object,现在我们要测试的零六呃,Is呼造器的参数,那首先我们这里边还是要去定义类了。第一个我们还是先来看一下之前的无参的这个,呃,构造器的类啊,无参构造class我们还是student类,这里已经有了STUDENT1,我们现在定义一个STUDENT2,大家会发现如果要是不构造器跟无参的话,那当然我们里边就需要把对应的属性就要单独定义出来了,单独定义属性哎,所以这里边我们可以定义一个name string不是值,给一个空参,呃,一个空值,然后接下来A值不是值,同样给一个空值,这个其实是非常简单的一种写法,跟我们之前在Java里边的写法也是非常的类似,但是大家会发现在Java里边如果要是直接这么写了的话,那。
03:25
其实是它下边还有一个。构造方法对吧?呃,就是构造方法的话,我们可以在传参,然后把this.name等于当前的这个传入的内部参数,然后this.h等于H参数,那现在呢,我们如果要是主构造器直接就在上面,那你直接这么调用的话,相当于没有办法给它赋值啊,所以如果用这种方式,那下边一定还得有对应的辅助构造器。进行传参,然后把当前的属性给它进行复制啊,所以这种方式其实是比较笨的一种方法啊,我们先在上面做一个测试,STUDENT2又一个STUDENT2,它中参,然后我们这里可以省略括号,所以直接这样就可以了,然后接下来打印一下数据啊,可以直接当前,我们可以直接打印STUDENT2,呃,那么对应的name就等于Dollar,这里大家要注意啊,当前的属性那要通过STUDENT2点内去做访问,另外还有age等于order,同样是student2.h,我们来运行一下,看看能不能正常的访问到。
04:41
没有问题,Name等于呢,A是等于零啊,都是空的嘛,呃,但是大家发现就是如果说我们想要更改的话,呃,这个就是我们可以在外边把它声明出来之后,然后直接通过这个student2.name去给它赋值去做一个更改,这个是可以实现的,对吧?那就是点name等于Alice student2rH等于18,哎,这是我们能够实现的这种方法,那如果说我们想要通过直接在创建它的时候就把对应的参数要传进去的话,哎,那就比较麻烦了,就必须还得定义辅助构造方法,这是之前我们已经了解过的这种用法,那大家可能会觉得这个比较熟悉,因为因为跟Java里边的实现比较像嘛,那我们这里边在SC拉里呢,推荐的是另外一种写法,上面定义等价于加。
05:42
对于什么样呢?就是直接在我们现在定义成一个焦点三,直接在主构造器里边传入参数,而参数呢,加上R的定义当前它不是可变的吗?所以我就直接把这个放在这后,后边是y age in。
06:04
来看这样的一个定义之后,就仅仅是当前主构造方法的一个行参了,它不是一个局部变量了,而且相当于就是我们在内部已经把它当成一个属性来使用了,就相当于我们把整个那个传入参数和赋值给属性的这个过程都已经省略了。如果要用上面这种写法,或者在Java里边的话,大家会想到这其实应该是好几步,应该是我们先在类里边定义一个属性,然后呢定义一个构造方法,构造方法要传入这两个参数,然后在这个构造方法里边把这个参数再附给this.name和this.h。那这几步所有的这些合在一起,Skyla里边直接用这么一行搞定,而且后面你会发现连这个构造方法,就我们当前的这个花括号啊类体都可以省略了,因为它不需要做别的事情了,直接用这个就可以给它赋值了。
07:01
接下来我们在上面可以测试一下value student3去new一个STUDENT3的实例,那这里边不构造,不构造器必须有两个参数,那我们调用的时候就必须传了,哎,所以这里边可以给一个比方说给一个BO20。我们接下来同样做一个print打印。当前就全部改成STUDENT3,再看STUDENT3点,Name是可以直接访问到的,这是没有问题的,H也是可以直接访问到的,然后接下来我们运行一下。得到结果name等于Bob age等于20啊,所以大家看这样的使用显然比前面我们这种方法就简单了很多,哎,你这样的话是扭出来之后还得单独去赋值,或者你想实现这样的直接调用的这种方式的话,就还得单独去定义辅助构造方法,对吧?哎,所以skyla里边比较推荐大家使用这样的一种定义方式,给主构造器传参直接定义出它对应的属性,那大家可能会想到,如果说我们这里边给这个bar会产生什么样的效果呢?那接下来我们再来测试一下。
08:18
是主构造器参数无修饰,我们把这个直接copy一下。当前拟一个STUDENT4里边我不需要二的声明了,里边就相当于只有两个参数完了进来,哎,那大家可能会想到,那里边我是不是还要单独再去定义这个属性呢?哎,我首先得看一看是不是它也可以直接把这个作为属性就放在里边了,如果要已经有的话,那就不需要定义了,那就简单多了嘛,所以接下来我们可以看一下。测试一下STUDENT4有一个啊,这个我们干脆就直接copy过来吧,跟上面的定义其实是类似的。
09:14
另一个STUDENT4要用STUDENT4传入。我们再换一个人,比方说CARRY25,然后接下来这里调用的就应该是STUDENT4NAME和student4.age这里其实大家已经看到了,我们这里边如果做这样的调用的话。它是爆红的,根本访问不到,这就说明name和age现在根本就不是class student4的属性啊,那所以就是这只是构造主构造器,它的一个行参,只是一个局部变量,并不是当前啊对象里边的属性,那如果要是这么做的话,那我们得怎么办呢?哎,那没有别的办法,因为这里边你赋值之后,我们属性里边根本就没有啊,那所以如果想解决这个问题的话,那就只好不要这么直接去打印,因为获取不到,而怎么样呢?这里再单独的去提供一个比方说print,像我们之前那样实现的啊,Print in for的一个方法。
10:20
我们直接啊定义这样的一个过程啊,可以一边要写的就是line啊,这里可以直接把上面这个直接copy过来。我们把当前的信息是可以直接访问到的name。然后这里我们写一个STUDENT4啊,那这样的话是可以做一个调用的,所以在这里就可以直接调student4.printinfo啊,大家看现在如果要做一个打印的话,同样可以打印出当前的值,好,这里我们多了一个画括号。
11:08
的话,可以得到同样的东西了啊,那所以整体来看的话,显然还是不如我们之前直接这样定义看起来更加方便一点啊,那所以这是我们最为推荐的写法啊,那希望大家是不要写成就是呃,我我我们当前的这种这种定义方式啊啊那有同学可能还有另外一个想法,就是说像我们之前的这种定义是不是可以写成呃,就比方说啊,我们这里边再单独的把对应的这个属性定义出来,是不是就可以了呢?比方说。把这个啊,呃,STUDENT4啊,直接做一个额外的定义,比方说我把这个叫做四四吧,那比方说现在我没有这个print infer这个方法,那我是不是可以单独的再去里边定义一个name属性string。
12:05
然后让它等于我们传进来的这个参数,对吧?那当然了,现在因为跟当前的这个name重了,那最好是给一个不同的名称,比方说我们这里边给一个大划线内,后面给一个大划线age,这里边ver int age于大划线age。这样的话是不是也可以实现相同的功能呢?哎,对,确实是这样的啊,但是非常不推荐大家这样去使用,这就相当于是呃,大家受。Java的毒害太深了啊,这就完全是Java里边的那种写法,对不对啊,就是我这里边传一个参数进来,然后定义当前,在类里边定义一个属性,然后再把这个传进来的参数赋值给当前的这个属性,那这样写的话其实就非常的麻烦,如果我们直接用上面的这种写法,显然就会方便很多啊,所以我就把这种写法直接注掉了。
13:05
那另外呢,还需要说,呃,就是我们这里边其实是可以有第三种定义方式,我们前面是有bar的这种声明,也有无修饰的声明,那与之对应的就还有。Value的生命我们在这里直接复制过来,接下来是STUDENT5,我们把这个Y改成vaal啊,改成Val这种用法其实比较少见的,因为V它下来就不能更改这个值了啊,所以就相当于是什么呢?我们当前如果要是直接在上面去做了,这就是创建了一个STUDENT5的话,那就是相当于是一个常量啊。我们把这个还是。直接copy过来,然后做一个1STUDENT5,又一个STUDENT5,当是合法的啊,大家看到这样定义出来之后,然后访问当前的这个值,是可以把它正常打印出来的。
14:09
运行一下没有任何问题,但是这里面的问题就在于当前的这个值不能再做更改了,好,那所以就是接下来如果说啊,呃,我们这个STUDENT5,它的位置如果要是增长了20,变成了21,哎,那这个肯定就报错了,对吧,是你将上边STUDENT3。它的age去增长,这是完全没有问题的啊,这就是关于我们之前说过的VAR和VL的区别啊,这个也是非常的明显,然后接下来呢,我们最后再说一下,呃,就是同时提供主构造方法和辅助构造方法的这种这种方式啊,我们可以再另外定义一个STUDENT6,那么这里边一开始我们讲解这个辅助构造方法的时候,是酶辅构造器里边是没有参数的,现在如果要是主构造器里边也有参数,辅助构造器里边也有参数,会是什么样呢?啊,其实也没有什么区别,那就是还是一样,辅助构造器必须要调用主构造器,只不过主构造器定义了这个参数之后呢,我们最好就是。
15:23
有这个value或者是Y的修饰,相当于把这个属性定义出来了,比方说这里边我们直接加上了前面的这一个属性,外一个,内外一个。把它定义在这儿,然后接下来呢,呃,那应该下面如果我们要有这个辅助构造方法的话,必须得是this,如果要是this的话,显然如果说这个辅助构造方法你还是这两个参数的话,那就没有必要了,而且这个相当于我们这里要方法重载嘛,相同的个数和相同的类型,这是没有办法重载的,所以肯定要有所不同。那比方说这里呢,我们或许还有一个新的格选属性,这个属性呢,那就单独定义出来,同时这里边我们有一个属性叫school。
16:10
String类型值我们就直接给一个画画线,然后接下来在这个辅助构造器里边啊,接下来我们就可以记这样的一些啊内容了啊,Am给一个string就可以有三个参数了,Age给一个int,最后再来一个school string,那现在它里边应该怎么样去处理呢?呃,这个处理的过程其实也非常的简单,必须要去调用一下主构造器,所以我们要现在的主构造器是有参数的,那必须就把name和age要传进去,然后接下来呢,自己还有一个school这个属性,那当然就是this.school等于school,哎,这样就搞定了。
17:08
然后接下来我们还可以单独的去一个它的print iner这样一个方法,呃,我们直接把这个copy过来吧。Copy过来之前我们打印的是STUDENT'6NAME等于Dollar name age等于age,后面我们还可以加一个school等于all school,那这样的话我们就可以完整的把这些内容信息啊,属性全部打印出来啊,那上面如果这个时候我们再去创建一个。但想到啊,之前我们这个其实。也可以直接访问它的属性,另外呢。也可以调用对应的方法,这里我定义一个STUDENT6,然后接下来这里就是STUDENT6点。
18:05
Name和age。最后我们用STUDENT6和它的printer方法,我们把这个打印出来。接下来可以看一下。大家会看到啊,最后我们都可以得到对应的这些内容,当然了,我们这里school没有经过这样的赋值,所以当然就是none了,如果前面我们调用的过程当中给了另外一个比方说school at硅谷,那这个时候。运行的话,然后自然school也就会有值了,这就是关于构造器参数的一些用法。
我来说两句