00:00
那现在呢,我们再来看一下方法的它的一个声明和定义,或者叫定义啊,就是有些人呢,喜欢把它叫方法的声明,有些程序员呢,喜欢把它叫方法的定义,这个是同一个意思。啊,这块呢,我们就说一下,那把它整理一下吧,我们来看一个完整的方法声明和定义,它的语法是什么样子的,大家看这里。首先呢,这有个关键词叫function,这个没什么可说的,后边呢,大家看到这一段小括号里面呢,是type这个地方,就是你这个方法要跟哪一个数据类型相绑定,这个receiver呢,就是这个类型的一个变量。对不对?比如前面我们写的P,这个是方法的名字,那方法的名字呢,就根据我们前面讲的标识符的命名规则来写就可以,这块大家看到是参数列表,其实就有点儿类似于我们学函数的时候那一个行参列表。
01:01
大家再看这里,这边呢是返回值列表,什么叫返回值列表,就是你这一个方法,如果有返回值,那么这个返回值列表就可以写到这里。就像我们以前写的,比如说我有两个int int对吧,甚至呢,我们也可以给他写名字,比如说第一个RESULT1。第二个RESULT2,用这个名字来跟这返回到这个参数列表进行绑定也是可以的,OK,好,我先把它撤回去啊,后面呢,这个大家这些呢,在讲函数的时候,其实我们已经讲过了,再看这里方法体,那方法体就是我们这个方法要完成的任务是什么?Return返回值。好,下面呢,我对他也做了一个详细的说明,什么是参数列表,参数列表就是代表方法的输入。你有什么输入就写清楚。比如说前面我们得到两个数的和N1和N2就是参数输入的参数receiver type表示这个方法是和type这个类型相绑定的,或者说方法作用在type这个类型。当然这个type是什么类型根据实际情况而定,比如说前面我们讲的person。
02:16
那这个类型就是person能理解意思吧,比如说你这地方绑定的是一个student,那就是跟student绑定的明白的意思,而且呢,我要多说一句啊,这个type呢,不一定是。结构体类型,它也可以是普通的这种数据类型定义的一个type,后面呢,我们还会举例说明,注意听这里啊,OK,大家看这我写的type可以是结构体,也可以是其他类型,其他的自定义类型,比如说吧type,比如说你写个integ。Inter int。那么各位同学,你也可以给这个integer来绑定一个方法,也可以的理解这意思吧,OK,后面呢,我们再举例说明好吗?
03:03
我们再看第四一个receiver,就是receiver这个呢就是type类型的一个变量,或者叫一个实例,因为呃,如果是结构体变量呢,有些程序员还是比较习惯把它称之为实例。明白,比如说person结构体的一个变量,或者是一个实例,前面我们讲到这个东西,大家看这里,我们在前面讲到这个练习的时候,大家看这里。对吧,诶这个地方我们讲的是。啊,Method这个这啊,你比如这个C就是circle这一个结构体的变量,或者是circle的一个实例都可以啊都可以这样说,然后呢,参数列表表示方法的输入,哎,就写过了啊这就多多余了啊写多了。多了,我把它去掉。返回值列表,返回值的表示,返回的值可以是多个,比如说你有多个返回值,你可以写到这里,然后方法主体呢,这个就不多说了,就是你这个方法要完成的一个功能,究竟是完成什么功能,根据你写项目的实际需求来定,比如说是一个计算的功能,也可能是一个连接数据库,往数据库添加数据的一个功能,对吧,都有可能。return语句并不是必须的,就说如果你这个地方没有return,那么就意味着你这个返回值列表也应该没有。
04:22
但是注意听,如果你这有返回值列表,那这一定会有一个return,明白这意思吧?好,这是方法生命的一个完整定义,我们也把它说了一下。把它整理到板书到我们的笔记里边去。反输到笔记里面去,这比较简单。好,我把它整理成标题三。好,这个地方是它的一个完整的说明,我把它整理一下,OK。好。整理一下啊,那当呃,当时我们整理了有这么几点,把它整理一下,第一点。第二点。
05:00
对吧,第3.receiver。是他的一个type的实例,然后返回值列表可以有多个方法的主体,就是实现某一个功能的代码块。然后呢,Return语句,Return语句不是必须的啊,同学们再说一遍,不是必须的,就是你你你你,当然你如果有返回列表了,那这个return语句肯定是有的,明白好把这个稍微整理一下。好,同学们,那是方法的声明,我们就说完了,那么我们现在呢,就来探讨一下方法注意事项和细节的讨论,大概呢,有五点,有些大家前面老师已经说过了,有些还没有说过,那么注意听讲,那方法的注意事项呢?第一个细节就是结构体类型是值类型,方法调用时遵守值类型的传递参数及只拷贝,这一点我们在前面画那个图的时候就已经说过了,不再举例。第二点,如果程序员希望在方方法中修改结构体变量的值,可以通过结构体指针的方式来处理,而且通常情况下,其实我们更多是。
06:06
跟它的这个结构体的指针类型绑定。也就是说实际上实际上我们绑定的更多的是结构体这个指针类型,而不是结构体本身,为什么呢?因为这样子我们可以提高传输的速度,呃,传输的效率,因为大家都知道,如果你给结构体这个类型绑定呢,它在传输的时候它是进行只拷贝,如果你给结构体只针对性绑定,那么这个时候它仅仅是传拷贝一个地址就可以搞定这个事情了,对吧?那同学们我们来举个例子。好,我把这块给大家整理一下,这个地方我们讲的是方法。方法的注意事项。和细节。OK,我们把它升级到这个位置,这是第三个是吧,第三个好,刚才老师思路啊,第一点刚才老师这个这个案例呢,前面已经讲过了,不再多说,第二点我们来看一下结构体改变。
07:06
这这个参数好,我们来举个例子说明一下。大家看到这里啊,同学们,我们就以这个为例,前面不是刚刚讲过这个circle吗?这个时候大家看我们绑定的是跟这个circle。呃,这个结构体绑身的,但是这种绑定的方式呢,它有一个问题,什么问题呢?他会把你这传递的这个C进行一个直跑,被给这个这个C,那这样的话效率比较低,因此呢,我们更多的情况下会这么做。为了提高提高这个效率,效率。效率。通常。通常啊,我们绑定给给什么呢?给这个绑,呃,就是说方法,我们我们的这个方法和谁绑定呢?和结构体。结构,结构体的这个变结构体的这个指针类型。
08:00
指针,指针类型绑定。那也就是说,通常我们会这样绑定。怎么绑定呢?同学们看到。注意听啊,这块我们写个。心。绑定。那这样子我们来保存一下,大家看到如果你这样绑定的话呢,同学们大家看这啊,这个这个方法肯定就不能取相同的了,我们取个二好吧,区分一下,那这个时候同学们,当我们调用这个方法的时候,其实。这个时候传的就是这个C的一个地址,那我们来调用一下,怎么来写呢。好,我们来试用一下啊,同学们。那你你要调这个方法,你要调你要调这个方法,那肯定是传这个地址过去是吧,那所以说我们还是老规矩,前面这个呢,还可以用一用。来,走一个。同样,我们还是创建一个circle的变量。
09:00
创建一个circle的变量,这个没有问题吧,那这个呢,我给他一个五。那这个时候我们在传递的时候,按理说一个标准的传输方式。一个标准的传输方式,其实因为这个时候啊,它它本身已已经是一个地址了。所以说我们标准的传这个调用方式应该是这样调用是先把这个它是指针,因为因为它是指针嘛,所以说你应该给他一个地址,标准的传调用方式应该是这样写。第二。E。Are a2。是不是这样写才对,因为你你这是指针,所以说我传一个地址过去,同样道理,如果是,如果是,因为这个C已经是指针了,标准的这个访问方式应该这样写的。因为你既然是指针,那我在取值的时候,我先用一个星号把值取出来再去调用,所以这这是这才是一个标准的使用方式。啊,因为注意听,因为这个C。
10:03
是什么呢?它是一个指针。它是指针。因此,我们标准的访问。标准的访问其字段的方式。字段的方式是什么呢?应该是这样写的,就是。这种方式。对吧。这种方式在第二我们的字段,比如说reduce。好,这样写才是最新的,那么我们先用一下啊。二。我们先来看看这个结果对不对,那么我把这改成5.0了,我们把它输出来。瑞讲好面积等于,然后呢,我把RESULT2给大家输出来,我们执行一下吧,抛起来请看效果,诶这种我先要进入到CHAPTER10。好,CDCD到我们这个还是这个方法里边是吧,还是这个method,嗯。
11:00
Me?Method什么CE这个里面好,我们go wrong一下。M。跑起来,我们看这个时候呢,输出的结果是这么这么多。78.5应该是正确的,应该是正确的,这样是对的,但是我要说一下,但是啊,但是我们编译器,我们这个构语言的设计者呢,他想象他觉得这样调用太麻烦了。所以说他在底层的编译器里面,他做了一个优化,也可以这样写。那么编译器。编译编译器底层。底层做了一个优化。做了优化,做了什么优化呢?就是你这种写法也可以。也可以等价。等价这个写法。他也允许这样写法。因为它底层呢会判断哦,他发现你是一个指针,它这个方式呢,它会自动把这个给你加进去,明白吧,它也等价于这个写法,因为什么呢?因为。
12:08
因为这个编译器。编译器会怎么样呢?会在会自动会自动的给我们加上。加上哪个呢?加上一个这个符号。哦,就可以了,同样的道理,这边呢也可以这样做,也可以等价于这个比较简单的写法,也可以这样写,虽然你是指针标准写法应该是这样子,但是呢,它也可以等价于这种写法。也是没问题的,他也允许这个我就不再多说了,因为前面呢,我已经讲过这个原原则啊,这也可以就是我说上面的这句话。也可以等价于这个写法,就是这样说吧,就这个写法。这个写法也可以等价。等一下怎么写法呢?c.reduce。他也支持这种写法O了。
13:00
明白好,就是这么一个简单的道理,那同学们那这样写了,这样写了过后我们来运行一下,看看对不对呢,来我们执行一下,那么为了看到有有变化,我把这个改成六。好吧,我把这个改成U,当然同时啊,同学们这个地方,这个地方呢,我们就把它改成新的写法了。好,那也可以这样写。直接用C来调用。也可以。把这个注销了啊。大家看这个能看懂哈,能看懂就是这种写法也等于它写法,所以说c.L2它也是可以的,那么我把它改成了6.0,那6.0我们仔细一下看看效果有出来没有,只要面积变化了,看对的。113.00033对不对,这个我们有格式化,同学们把它格式化一下就行了,好吧,那我们再改一个七。再来执行一下,看有有没有变化。是吧,变级呢,又发生变化没问题吧,好,所以说这种这种写法大家要明白,就是为什么这样可以写,不然的话,你这样子去跟别人一讲,哦,老师这方是个指针,那你为什么可以这样去写呢?为什么跟原先这个类型是一样的呢?其实不一样,它底层做了优化而已,只是在形式上一样,但是机制已已经发生完全的变化。
14:19
那为什么这么说?同学们,如果我问大家一个问题,如果我这样写啊,c.radiOS。等于。十。等于十,那我问大家一个问题,如果我在这里面c.radiOS改成了十,那我问大家在这外面这个C的radiOS有没有发生变化?有没有发生变化,我们可以把它输出来。来走一个,我说C点。Radius。它的这个等于多少呢?来我们看一下。我我把它输出来啊C点。好,大家想一想会会不会变化。
15:01
大家想这个地方传的时候c.L因为你这个类型是指针类型。那么这个时候这个C它拷贝的这个副本其实不再是这个结构体,整个这个结构体,而只是它的一个指针。因此这个C。也就是说现在老师说的这个C。其实它就直接指向了你这个main函数里面C,因此你在这个函数里边对它进行了修改的话,其实在外面这个地方也会发生变化。也就是说输出来过这个应该等于十才对。明白吗?那同学们可以试一下。我们运行一下,我们会发现它的确发生变化。发生变化,为什么发生变化了?就是因为这个地方已经不再是一个结构体,整个词拷贝,而是地址,如果我们画一个画一个图来说这种写法的话,他就应该是这个样子的,同学们注意听我呢。
16:03
老规矩。我把这个呢给大家粘过来。我就画一次啊,因为这个呢,我们前面没有画过,所以说我画一次。这个画图有点累,但是呢,确实很容易把这个事情说清楚,同样道理,我把这个呢也给大家拿过来。最近。好,这是我们的这一个ERRORS2,它的一个方法。好,我把它也拿过来。这是两段核心代码,然后呢,这是我们的一块内存。这是我们的一块内存,没什么可说的,这是内存,对不对?写到这里来。那既然是内存,那首先呢,代码就从这里开始执行了,从哪里执行,这是这是我们的主函数对不对。这是我们的主函数,好主函数,那么这块呢,我们认为有一个主站,它是一个独立的数据空间。好,还是老规矩,按照以前的画画法写就行了,命赞。
17:05
好,此时此刻这有个C,好,这有C的话呢,同样道理,在我们主站里面肯定会有个C变量。这个没什么可说的,C变量呢,呃,C这个它是个结构体,它指向。对吧,它会指向一个,我就偷个懒啊,我就这样写。这块写起来就有点麻烦,我干脆直接啊,同学们,我直接这样简单说一下就行了,那根据老师思路来走啊,我就直接在这写了啊C它是一个结构体。指向了一个数据空间,这个数据空间里面有个radio,它默认为它是7.0。啊,7.0。那么这个字段的名字叫什么,Reduce?好,那紧接着呢,他做了这个动作。c.L2注意这个时候。这个时候还是老规矩。这个时候还是老规矩,会开辟一个新的独立的一个站。
18:00
对吧,读这个数据空间嘛,我们叫ERROR2这个站,这个时候注意听,他就不是把这个站拷贝过来咯,注意听啊,此时此刻,当他发现这个C它是跟一个指针绑定的时候,那么这个时候它仍然会有个C变量,但是这个C变量呢,它其实指向了一个什么呢?它指向的是这个地址,指向的是他,所以说。说当当然你这边肯定会有个地址啊,你们肯定会有个地址,就是你这个空间本身会有个地址,假设这个地址我们叫0X111111122假设啊,那相当于说这个地方,这个地址就会拷贝到这里来。那当然了,此时时刻这个C已经是个是个指针,它当然存的就是个地址了,那在我们内存里面就相当于什么意思呢?就是说这块它指向了它。能理解这个意思吗?它指向了它,那指向了它,好紧接着你进到这里边来,你说c.radio其实按理说同学们啊,按理说你这个C是个地址,你就不能这样反问对不对。
19:07
其实你标准的写法应该是心。C括起来点出来,就是这样才能访问到这个空间嘛,但是我我有讲过,我讲过好多遍了,就是因为这个C虽然是指针,但是他在数据库这个编译器在底层里面,他把这个信息给加进去了,所以说这样访问c.radio也能访问到这个空间。然后他把它改成多少了呢?把它改成了十。明白,然后他又去执行的这个运算,那当然就是3.14去乘以c.RADIO4,但是这个时候这个c.radio可真的就是从这取的啊。跟我们前沿是完全不一样的,它真的就是取到这个命站里面这个C,这个结构体指向的这个数据空间的时。可这里面可就没有,没有那个数据空间了,没有那个所谓的结构体那个数据空间了,它真的就是从这取的。明白明白这意思吧。
20:00
那如果你们有兴趣,你们你们可以把这两个地址打出来,一看就知道,肯定两个地址是一样的,那有些众说是说我们打一下试试看,如果你们确实对这个感兴趣,我可以给你们打出来看一下啊。你你比方说现在我们先把这个主站里面这个C的地址打出来,我们来看一下,听听我说啊。我们为了打消大家的顾虑呢,我写一个就是说main里面这个C这个它它是个结构体啊,它是个结构体变量。结构体变量。他的地址。它它它的地址,它本身它的地址等于我们把它输出来。那是不是就应该取个定子符C吧?是是这个意思吧,好,为了好看呢,我们把它斜杠一下。斜杠一下,好,那等到这个里面里面的时候,这个C它已经是个指针了,所以说它就应该把它内容取出来,是这意思吧,好,我们再取出来。F mt.print f。
21:02
好,我们取到C,这是CC是一个指针,是个什么指针呢?是一个。他是他是这个类型的。四个指针,它的内容。他的那个它指向啊,它指向的。指向的。指向的地址,它指向的地址其实就是什么呢?就是我这画的这它这里面存的这个地址是不是它指向地址就是它的内容,那内容的话是不是就直接这样是就取了,不不需要再用这个了啊,为什么不需要再用了,因为C本身它是就是指针,你再取一个,再取一个地址的话,就变成取什么了,就变成取他的。取他这个地址存放的这这个这个位置了啊,那存的就取的就这了啊。取的就是0X什么什么什么取的是这了啊,是两回事啊,比如说01122,呃,不,那比如说0X3344,明白吧,这个呢,我们并并不关心,所以我就不取了,能理解吗?我就不取了,好,那那这个时候我们应该确认一下,就是这个地方输出的地址应该和这个地方地址应该怎么样。
22:16
应该一样。应该一样,但是我这不要再取地址,就说这个地方取出的地址应该和这取出一样,就证明我们这个关联关系是怎么样子的,是成立的,能理解吗?那我们来跑一下。跑起来。我们跑起来,我们一看,我们一看,我们发现这两个弟子的的确确它是一样的,你看。面里面这个结构体变量本身的一直是它。而C。这个指针指箱的地址呢,也是他,因此我们可以看到2038嘛,2038,因此他们的的确确就形成了老师画的这个内存图的关系就成立了,能理解了吧?好,这次应该画的就非常清楚了,好,那关于我们说的这个细节,老师就讲完了是不呢?如果程序员希望在方法中修改结构体变量值,可以通过结构体指针的方式来处理,而且通常情况下我们就是用这个来做。
23:11
为什么呢?因为这样效率高啊。为什么效率高?是不是这个图形画的非常清楚?如果我们这个结构体很大。是有好多好多字段,那我只传一个地址就过去了。对不对,如果你你按照以前那种方式跟结构体变量结构体本身绑定,那他要进行一个只拷贝。那整个就完蛋是吧,效率就低,明白意思吧,好,那我把这个示意图给同学们拷贝到这里,希望大家引起一个重视啊,好,这是它的一个示意图。这块一定要把它拿下。很重要啊,同学们,很重要。我把这个示意图给同学们站到这里来,加深大家对他的一个认识。好,这是我们讲的方法的注意事项和细节的第一部分,我们先介绍到这里。
我来说两句