00:00
哎,之前测试访问权限的过程当中,我们不仅发现了属性的访问权限怎么样去使用,而且呢也了解了怎么样在类里边去定义一个方法,以及怎么样去创建一个对象,那这两部分其实非常的简单,方法我们发现这其实就是一个定义在类里的函数嘛,只不过就是函数名我们换成一个方法名,函数体换成方法体啊,其实之前我们也讲过,方法可以看成一种特殊的函数,函数在scla里边概念是更加广泛的啊,所以这里边其实就是一个函数的定义,在调用的时候呢,我们要稍微的注意一下,定义的时候,大家看到这里边就是直接啊DEF啊,把这个方法声明出来就可以,如果要是有这个子类要去复写重写这个父类的方法的话,那就加上这个override关键字就可以了,这是关于它的声明,那调用的时候呢,当然就是要基于一。
01:01
的对象去做调用对象名儿加上点儿,然后调用对应的这个方法就可以了,非常的简单。那另外呢,还有一个就是怎么样去创建一个对象,关于创建对象,这跟Java里边也是一样,直接new,然后加上当前类的名称括号,就创建了当前类的一个对象实例,然后就可以把它赋给一个这样的变量,当前的这个变量呢,它其实就是当前对象的一个引用了,我们看到前面可以加一个修饰符是va al,当然也可以是VAR,它们的区别自然就在于当前的这个引用是否可以更改啊,那我们之前在讲到vaal和VAR的区别的时候也提到过,这里如果是一个vaal的worker的话,那其实大家知道目前果要是对这个worker重新去给它赋一个值的话啊,或者我们这里边直接去又一个worker重新赋值的话,当然是不对的。能这么去做,但是我们可以针对worker里边的所更改的属性,比方说age做一个更新,哎,这是完全可以的,那如果说前面我们这个worker本身是一个war类型的话,那当然下面直接这样去更改就完全正确了,对吧?啊,这大家是已经了解了这个区别的,所以这里我们就是直接带过,接下来我们的重点呢是要介绍。
02:29
GALA当中的构造器,哎,那其实我们前面发现既然是创建一个对象,要去拗一个对象实例出来,那在Java里边我们这个new的过程啊,其实是调用了Java当中类当中的构造方法,Java当中构造方法比较特殊,这是在类里边一个跟类名完全一样的方法。而且它没有任何的这个返回值啊,所以构造方法当然也可以重载啊,就是我们可以直接传入不同的参数个数或者参数类型,可以有不同的这种实现,那现在我们在这个skyla里边好像根本没有看到类里边定义这样的构造方法呀,哎,那它到底有没有构造方法呢?我们在拗这个类的实例的时候,到底又是做了哪些操作呢?
03:18
艾克里。关键就在于scla GALA里边有一个构造器的概念,所以在skyla当中,构造器其实就相当于是Java当中的构造方法,只不过这个定义呢略有不同,在sky skyla当中,构造器不包括两大类。主构造器和辅助构造构造器我们可以看一下它的基本语法,大家看到这个class类名,这是首先定义这个类的,这个过程后面画括号里边当然就是类体了,这里大家要注意一下,在定义这个类名后边其实是可以加上一个括号,然后给一系列的行参列表的。
04:01
这里大家会发现类名再加上后边的一个行参列表,这不就像一个构造方法一样吗?就像一个方法定义的这个过程,所以这其实就是我们的主构造器。啊,所以这也是考虑到之前我们在Java里边声明的时候啊,既然构造方法跟类名称是一模一样,那你何必那么麻烦呢?哎,我这里边直接在类名后边把对应的行单传进去,就把它当成一个特殊的构造方法就完了嘛,所以这就是它的构造方法,而且是它的主构造器。顾名思义,这个是最主要的那个东西,与此同时呢,还可以在类题里边单独去定义辅助构造器,那所谓的辅助构造器呢,必须用this这个关键字作为当前的类名啊,当前的方法名称,别的都不行,必须是this,那对于这个辅助构造器可以有多个主构造器,因为它是类名,后边直接加上行参,那这个只能是独一无二,只有一个了。而后面的这个this呢,可以重载,可以通过参数的个数和类型来进行区分。
05:14
那这里大家需要注意的是辅助构造方法,在这里边不能直接去构建对象,它必须直接或者间接的调用主构造器啊,所以这里边就是说主构造器是必须有的,主构造器呢,在创建对象的时候还要调用主构造器,那怎么样调用主构造器呢?难道是说直接用这个类名去调用吗?不是的,它调用的时候直接就是写this,然后至于后面的这个行参,那就要看主构造器到底是什么样的参数列表了,按照这个去调用主构造器,所以相当于主构造器和这就是我们这里面的主构造器和辅助构造器,相当于它的名称都是this对吧?啊,就是用this来表示我们当前的构造方法,然后另外还有就是构造器,如果需要去调用其他构造器的时候,那就必须要调的那个构造器。
06:10
提前要声明出来,也就是说,比方说我们第二个辅助构造器可以去调用第一个辅助构造器,这是允许的,但是第一个辅助构造器不能调用第二个。因为在这里边第二个构造器还没有声明出来。这就是构造器的一些基本的要求,那接下来我们就在代码里边做一个具体的实现。还是new一个scla的object单立对象S的啊,现在是零五,我们要测试的是构造器,没方哪,先先写出来,然后接下来呢,我们既然是要测试不造气,那肯定最重要的还是要有一个类了,我们首先定义一个类啊,这个类我们就还是回到最初吧,因为不涉及到继承关系嘛,我们就还是定义一个学生类吧,Student,但是因为之前我们已经定义过student类了,所以这里边我们干脆定义一个叫做STUDENT1,稍微的做一些区分。
07:22
然后这里大家会发现之前我们定义的过程当中,后边什么都不加,然后直接接下来就是划括号给这个类体了,这代表什么呢?其实这就代表我们当前骨构造器。没有参数对吧?哎,大家之前想到SC里面有一个什么特点呢?它就定义的时候一个方法,如果没有参数的话,本来应该是空括号,那是不是空括号就可以省略呀?啊,所以大家会看到里边我们之前的那个写法,其实就是主构造器省略了空括号,因为没有参数省略空括号之后的那种状态。这里边如果要是解出这个空括号的话,也是正确的,也是完全没有问题,然后接下来在这个列里边,我们首先还是定义属性,我们可以定义哇,Name string类型,哎,大家应该还记得这个在里边定义属性的时候,可以直接给下划线做一个默认的空值,定义H,定义一个int类型的,也是直接给一个控制,这是把属性先定义出来,然后接下来呢?呃,大家可能会想到,就是对于我当前的这个主构造器啊,它不是一个构造方法吗?那这个构造方法里边我们要执行的那些操作到底是在哪里定义的呢?
08:46
那就是它的方法体到底在哪里呢?诶,大家直接看这个模样,这不就是方法名称,呃,类似于啊,方法名称加上参数列表后面划括号,这不就是方法体吗?哎,所以大家会发现啊,这里边我们定义属性的过程,其实就是当前在主构造器里边做的这些操作啊,就是主构造器的方法体里边做的内容啊,所以这里边假如说我们直接打印一行的话,那自然这里边其实应该就是我们解一个一吧,这里当前就是主后造。
09:22
方法被调用我们的,呃,第一个构造方法,然后接下来呢,除了主构造方法之外,还可以声明辅助构造方法,那么这里声明的必须是EF this,当前的名称必须是this,除此之外不行,然后当前这个this呢,啊,那就。组构造器已经是空参空参了,目前肯定就必须得有参数了啊,比方说我们现在不是有两个属性吗?那要赋值的话,我可以给一个比方说把这个name传进来词缀,然后接下来大家要注意啊,当前的S这样一个辅助够的方法,也不需要有任何的返回值,这一点跟Java里边是一样的,然后接下来我们看它必须要直接或者间接的调用主构造器,那现在他要间接调用,那就是他得调别人了,也没有别人啊,那所以就只能是直接调,直接调怎么调呢?S括号。
10:28
因为主构造器是空参嘛,所以。中括号,这就表示调用的是主构造器,我们这里是直接调用主构造器。然后接下来可以打印一句话point line啊,当前我们把这个叫做二个辅助构造方法一一定要用,有了这个之后,接下来我们是先写了一个这个print line啊,那关键的操作还没做呢,我们当然是要做这个赋值了,当前赋值属性怎么去拿到呢?当然我们可以用这个this点内等于内,因为大家要注意你这里边直接写name的话,来也是可以访问到我们外边你好的这个属性的,如果直接写name的话,这里边我们的作用域优先的是当前的参数,对吧?哎,所以这里边最好是写成s.name做一个复制,然后接下来可以直接print line啊,当前。
11:41
我们做一个这个字符串差值a Dollar name,然后后面是配Dollar h,就是我们当前传进来的参数啊,可以看到啊,然后接下来我们还可以继续定义其他的辅助构造方法,因为大家知道之前我们两个属性吧,两个属性应该是都可以传进来的,一个name,一个H,这只是一个int类型的途径,然后接下来这里边我们就可以既然之前已经有一个辅助构造方法了。
12:20
那接下来我们就可以间接的调用主构造器,那就是可以调用之前的辅助构造器,那这里调用的时候是this,名称不都是this吗?相当于我们这里边做了方法重载。调用前面的第一个辅助构造器的时候,它有一个参数是name,所以我就干脆直接把当前自己的内定去一个调用,那大家知道当前如果调用了这一个第一个辅助构造器的话,第一个辅助构辅助构造器又会调用主构造器,那就相当于就是间接调用主构造器了啊,这就是我们所说的这个过程啊。接下来再去我们直接把这个copy过来吧,剩下的过程就基本上类似了,三如构造方法二要用,然后接下来呃,这this4.name,其实我们已经在调用辅助构造器一的时候已经做了赋值了,所以这里我直接把这个一做一个赋值可以了,然后下边我们可以把这个name和age啊直接做一个输出。
13:26
这就是当前我们定义的这个构造器构造方法,呃,然后这里要给大家重点区别一下,就是Java里边我们是可以直接定义一个跟类名一样的方法的,那在scale里边啊,我们其实也可以直接定义一个跟类名完全一样的方法,大家要注意,这样定义出来的话就根本不是构造方法,它其实就是一个大家看就是一个普通方法,然后我们说如果不加等号,直接给这个花括号的话,它相当于是一个过程,它默认是一个返回unit类型的这样的一个函数,那这里边我们直接print line,这其实是不是构造方法被调用,而是一般方法被调用。
14:19
就是关于构造方法的这个定义啊,然后接下来我们可以在main方法里边做一个测试,那要测试当然首先还是要去创建一个对象了,STUDENT1又一个STUDENT1,哎,大家可以看到目前我们定义的这个过程呢。就是new student1,然后加括号,这其实本质上就是调用它的主构造器,对吧,哎,那。大家知道了啊,既然当前的这一个括号可以省略,那其实我们这里创建STUDENT1这个对象的时候,调用它的主构造器的时候也可以省略括号,相当于我们那个方法调用吧,啊,然后有了这个STUDENT1呢,我们这里还可以直接去调用它的一般方法STUDENT1,接下来我们可以运行一下,看看效果怎么样。
15:12
大家看到这里边就是前面new student1的时候调用了主构造方法,所以写了一句一主构造方法被调用,然后下边呢,调用STUDENT1的时候,输出了一般方法被调用。这就是呃,我们创建一个对象的过程,能够看的非常的细致啊,非常的明显,然后接下来呢,我们还可以测试一下其他的。塑造方法的调用,比方说这里边我们定义的时候,假如传入参数直接给一个name,类似的话,当然当前调用的就不再是补构造方法了,而是辅助构造方法,那或者下边我们还可以直接还两个,呃,这应该是STUDENT3,还两个参数TOP25啊,那接下来我们来运行一下,看看他们分别得到的结果是什么,这里大家可以看到啊,首先前面这个是是我们第一次STUDENT1得到的结果,然后接下来这就是STUDENT2了。
16:18
大家发现它并不是直接先输出的辅助构造方法,而是还是先调用的主构造方法,因为啊,我们这里边首先它是要调用主构造器的,对吧?啊,所以这里边还是先是一主构造方法被的调用,然后辅助构造方法被调用,接下来Alice丝0H0H,因为默认是这个空值嘛,Int类型的空值当然就是零了,这就是我们第二个STUDENT2创建的时候调用的构造方法,那STUDENT3呢,它创建的时候这个调用的是啊,最后一个啊辅助构造方法二,那么这个时候呢,它先调用了辅助构造方法一,而辅助构造方法一又调用了主构造方法,所以这里边是123的顺序,而且在调用辅助构造方法一的时候还要输出一个BOB0,因为当前print line的时候,A还是零,而这个调用完了之后呢,在后边我。
17:18
我们这个辅助构造方法二里边又做了一个H的赋值,所以最终是BOB25。这就是关于构造器的内容,大家可以把这些内容完整的测试一下。
我来说两句