00:00
好,那么我们先不着急呢,去说这个方法的内存的一个解析呢,啊,咱们先做俩练习呢,先感受感受啊,诶在这个method里边呢,这一个ec,我们直接呢就做这道题了,呃,这里边呢,就提到了我们关于上边属性的一个题目的一个,呃再修改,所以呢,将我们练习一里边呢,关于员工信息放到这个方法当中,通过方法呢去调用来进行显示。那我们就直接呢,把练习一里边的这两个代码呢,咱们CTRLC一下,直接呢CTRLV啊把它呢粘过来。好粘过来以后这些呢,我们就全部都关掉了,然后呢,它是这个意思啊,咱们在new完这个employee之后啊,给这个属性呢,赋了值了,赋了值以后呢,我们是自己在这呢去调用的。啊,这个呢也是自己调用的,所以你要是经常性的这样去操作,说不妨呢,我们就哎干脆声明成个方法得了,这个方法呢,我们就放到employee这里边了,所以在这个位置,哎,我们就可以呢去。啊,定义一个方法。啊,然后呢,说用于。啊显示啊员工的。哎,这个显示啊,哎,这个员工的这个叫属性信息。
01:02
诶这就可以了,你需要用的话呢,你直接来这调就行啊呃,那么我们就写个public了,那么这个访问类型怎么办呢。要不要?哎,其实这块呢,就是咱们自己写的代码了,嗯,这个呢,他没有明确说,我呢就可以写成是个word。哎,这个方法名呢,比如我们叫受。啊受显示是吧,需要参数吗。人家说需要,需要的话呢,你告诉我你需要这个参数是什么参数要干什么。也就是说,传属性。属性直接可以掉啊。诶,其实呢,是不需要的啊,不需要的啊,在这里边怎么写呢,就是把诶刚才的这个代码我CTRLC。我拿过来,但是呢,会报错。因为这时候我们也没有具体的这个对象是吧,你把它删了就行了啊。
02:01
这呢,不就是语法上呢,就我们方法里边可以调属性吗。写完了啊好,写完以后的话呢,回过来我们到这测试的话呢,就不用再这样去写了,把它呢注释掉,直接呢在这个位置。哎,就我们叫替换为是直接通过EP一点,我调一下受。就可以了。他打印的就是这些信息啊,同样的下边也一样的道理啊,把它一注释。哎,替换为。EMP2,哎,我们去调一下这个数,诶看这时候就省事了啊,这不就我们所谓的你这代码写的多了,有点冗余嘛,我们直接调一个现成的方法啊。封装了你这个具体的代码。好,这边也有同样的效果吗?行,这个能理解是吧。嗯,好了啊,那么回过来这块呢,我再说一下这个位置的话呢,咱们在写的时候呢,我写成word了里边呢,输出语句就写到里边了啊。呃,输入语句写到里边,有的同学呢,可能自己在写代码的时候呢,一不小心就写成这样了,怎么着呢,就是他自己呢,呃,写了一个c out啊,然后在这里边呢,把这个E点授方法呢,又写到这里了。
03:10
他这样写的。是不对的是吧,这个怎么解释啊。嗯。显示这个是吧。对,就是这个方法,你注意它是个就是没有任何返回值,咱们讲这个输出语句的时候呢,这个位置呢,你要是不写呢,行那就是行是吧,要不呢,你就写一个常量啊,你写个变量啊都行,哪怕你写个E都行,就是你得告诉我我要打印什么。嗯,那你现在呢,你整了个EP点受编译器看到的这就是一个没有任何返回值的一个东西。打印。看不出来呀。对吧。对,就是这个它就是错误的啊。除非呢,你这个方法。有返回执行。
04:02
啊,首先这个呢,我们说是编译错误啊。哎,这个是编译报错的,哎,那么怎么着就不报错了呢,你看我回过来这样啊,这个方法的话呢,其实咱自己写的也没有说非得写成Y的,有同学说我就想写成有返回值的,我觉得也可以。那返回值比较适合的呢?应该是死盾类型。哎,不妨,我就兽医吧。通过这个我们再强调一下,你说我这块还能叫受吗?不行是吧。重名了,其实这个呢,呃,在一个类当中是可以声明重名的方法的。你看这个名跟这个名跟这个名,这不也是重名的吗。但是它后边不一样是吧。诶对啊,像这些方法咱们,诶后边就讲这叫方法的重载。就是名一样,然后参数不一样是吧,就非常简单,这叫重载了啊,哎,那我们回过来这儿呢,你都没参数,然后都叫受,这是不行的。
05:09
这个大家也不用死记硬背啊,你这样想,如果我要是允许存在的话呢,我在这块调售了。对,那你说我是该返回啊,还是不该写返回值啊,就懵了是吧?对,所以这个呢,我们就理解成了就是。自洽是吧,或者我们那个就自然而然。毕竟这个编程语言都是人写的,咱们也是人。咱们应该是有这种心灵上的共通的是吧?啊,很容易理解啊,所以这块就受益了,好,那这个呢,我写成是有返回值的了,那你就可以在这里边我就得return了哈。我就这么着了。可以吧?表达的意思其实一样,只不过呢,这个就直接在里输出了,我这个没输出啊,这个没输出是一个string,我回过来如果说呢,诶这块你注意看啊,我就写成了叫EP一点兽医了。这个你运行的时候,你发现呢,怎么感觉啥也没有呢。
06:04
这个是我们这个。嗯,诶,啊。就是这个是我们这个输出的是吧,然后这个呢,没有出来东西,然后这个呢,是我们下边这个了。所以这个没执行吗。哎,他执行了,只不过呢,执行完以后的话,你里边也没输出啊。对他有返回,返回你也没接收啊。诶,所以呢,就默默的结束了啊,诶你如果想看一看,说你这个结果多少,你就把它打印一下就完了。所以打印的话呢,你一方面啊,可以呢,先接收为一个变量,然后打印这个变量。或者呢,我就直接呢,就。我就输出了是吧。这样也行,那这个呢,就不报错哈,上边这个报错,这个不报错。这个是编译通过的,因为呢,人家这个line说我看到它的时候,说我看到他看到的是个什么呢?我看到的是一个string。所以呢,我这打印的就是一个润。走一下。那你看这时候我们就输出了这个语句呢,是你加了输出语句所才能看得到的啊,这个小细节呢,大家注意一下就行了。
07:06
好,这呢就是我们关于这个方法里边的这个课后的这个练习题,哎,我们就说到这儿了。好,那么刚才呢,咱们是做这个关于方法这块的一个课的练习题了啊,这个练习题呢,我们就说完了,说完以后的话呢,我们在做这个艾特硅504啊好多这个练习之前呢,咱们再说一下关于方法调用的一个内存解析,诶前面的话呢,我们讲过,诶关于呢,我们创建一个对象,诶创建完这个对象之后呢,这个相关的一些属性,在堆空间的一个分配的时候的一些内存的一个结构了。啊,这个完了以后呢,我们下边呢,讲了方法了,专门呢看一下这个方法来调用时候的一个情况。方法这块的话呢,我们格外的需要强调一下呢,就是关于这个行参和这个呃13的问题哈,呃这儿呢,也是我们首次呢明确这里边儿呃这样两个词儿,行三呢已经体现过了,13还没有接触过。好,那首先的话呢,我们说呢,什么叫刑参啊,这个行参的话呢,其实全称呢叫做形式参数,它指的呢,就是我们在方法声明的时候啊,一对小括号内啊指明的一个或多个参数,哎,我们称为呢叫做形式参数,哎,我写一下啊。
08:13
方法在声明时啊一段小括号内。啊,然后呢,声明的啊,一个或。诶,多个参数啊,或者叫多个形式参数。啊,这个呢,我们就简称为叫刑餐了。啊,其实咱们在上面讲这个方法声明的时候呢,诶说过这个刑餐的事儿了啊,这个叫行参,然后呢,什么叫食参呢?诶很明确的场景呢,就是方法在被调用时。哎,在do这个时候啊,其实我们这个场景呢,就很多了啊,比如说我们这块呢,对应的这个有这个person诶调一的方法,然后我们下边呢,还定义的有这个比如sleep sleep这个方法,像这个hour呢,就是叫行残,然后呢,我们在哎这个位置啊,通过这个P1,哎咱们去调一下这个叫哎sleep这个方法,这呢,比如我传了一个八。
09:01
这个八的话呢,我们看作呢,就叫做石惨。哎,就是实际传递给这个行参的这个值。啊或者呢,实际传递给我们这个形态的这个呃变量是吧,呃也可能是一个常量了,这个我们就称为它叫石残。哎,其实很好理解啊,诶回过来说方法呢,在被调用时实际。哎,传递给啊行参的这个变量或者是常量,哎,就称为。嗯,就称为呢叫哎实际参数吧,简称叫实参。诶这呢其实比较好理解啊,就是你就记住了,一个是声明的时候呢,一个呢是调用的时候呢,实际传过来的,哎就这样一个场景,好,那下边的话呢,我们就看一看这个方法呢,在被调用的时候呢,它的一个内存的情况,哎,那咱还是回到呃对应的咱们这个第六章,第六章呢这块我们提供了一个PPT,诶把它呢打开。诶打开了啊好,打开以后的话呢,咱们昨天呢,是不是画了这样的几个图,诶然后第三个的话呢,关于对象调用方法的一个过程,诶咱们来看看这个事儿啊好,那么这个事儿里边呢,呃,前面这块呢,还是跟我们对象调属性相关的啊这儿呢,咱们再复习一下,快速的我写一写。
10:15
好,那我们在调用main方法的时候呢,诶首先呢,其实这就已经算是一个方法的调用了啊。哎,这个方法在调的时候呢,我们说每一个方法对应的是一个战针,哎战针呢,属于我们战里边的基本结构啊,所以呢,一定要没方法,诶直接呢这块我们就会入战一个。哎,这样的一个战争啊,这个咱们一会儿不是还要用别的方法吗?我这就给他留一份了啊好,那么这时候呢,这个方法呢,是对应的是may方法。哎,所以这块呢,我就写上这个叫哎妹。战战就相当于是一个战争了啊,然后呢,这个方法里边,只要是在方法里边生命的变量呢,都算是叫局部变量,哎,局部变量呢,都放在这个战争当中,所以严格来讲呢,第一个应该是。是不是二啊。诶,对的啊,只不过这块呢,咱们也没有用上它啊,所以这块呢,我就之前呢没有写它了,现在咱们写上呢,就留着它了啊好,这是一个了,然后再接着往下呢,我们声明了一个,诶person类型的一个叫P1,诶我这就在这写个叫P1了。
11:14
好,然后接下来啊,我们提到过哈,凡是扭出来的结构呢,都在堆空间当中,所以我们用了一个person。啊,这个咱们昨天都讲过了啊好,那么你完这个person以后呢,会有一个首地址值。我把这个地址呢,给它标出来啊。0S,比如说AB。那么把这个地址的话呢,我们就付给了啊,这不是一个负值运算符嘛,左边这个P1了,所以这个地址呢,就是0X啊12AB,诶通过这个地址呢,我们占空间的这样一个变量就指向对空间的这样的一个对象实体。哎,你像我说这些话的过程当中啊,大家你自己呢,也可以自己小声的叨叨叨叨。啊,因为这呢,都属于一些咱们讲的一些专业词汇了,是吧,你回头呢,在呃工作当中你跟同事交互啊,包括你笔试面试的时候呢,你不能说就是就是那个东西是吧,就是那那那个数。
12:07
这就很业余了啊,你得有这种专业的词汇,显得你会更专业一些是吧?啊,那这些词汇的话呢,你看我我就在讲,你也能有意识的可以自己说一说啊。要不你以为你自己会拉,结果一张嘴的时候发现不行。通常都会这样啊,所以大家呢,学六个月呢,呃,就是基本上衡量你行不行的话呢,就是呃,最起码别人呢讲了一些技术点,你得能够听出来他说的是对或错。如果这个听不出来,那说明人家确实就没学明白是吧。哎,你知道对和错呢,这是一个基本的点了,然后再高一层的话呢,就是你自己呢会用。再高一层呢,你不管会用你还能会说。啊,你会说了,那肯定是呢,会用了。你说能不能说会说,但是不会用的。呃,前期可以,现在你说我会说不会用行,但是你像我们这六个月呢,讲的东西是非常多的,你到最后一种状态,特别能说,但是不会写。
13:01
嗯,好像不太可能是吧,呃,因为呢,这个咋说呢,你这个几个月呢,就跟搭一个大厦一样哈,前期的话,你这个底儿比较楼层不高呢,你我会说不会写还行,这个楼搭高的时候呢,这个塌了就是吧,呃,你撑不到后边的。通过写去积累这个底儿啊。好,这个会说的话呢,就是这些专业词汇呢,你得能跟得上啊,要不笔试面试的时候你就容易吃亏啊。啊,你不能这个描述的时候呢,说不出来,憋得满脸通红的。啊,其实心里边儿知道啊。好,那么这块呢,我们就指向了这个堆空间的这个实体了,然后实体当中我们说呢,就存放了它的成液面料,还是那句话啊,成业面料都在堆里边。那我们这块呢,有三个成因变量。所以呢,都放在这个里边了啊。Name。哎,Name,然后age。然后呢,这个真字啊。啊,这个呢,我们稍微的把它变小一点啊好,那么这一行代码的话呢,其实还没完事呢,呃,我们提到有个默认值的问题。
14:09
哎,这个这法人的哈啊,默认的给变成大写这个呢,它其实也是个零。呃,那么第一行代码,哎,第一行代码这一行呢,我们就搞定了。搞定以后呢,我们下边呢,通过这样一个占空间的一个变量啊,指向对空间的一个实体调这个属性改值。这个咱们昨天其实都讲过这个事儿啊。哎,杰克。杰克。好,相应的我们把下边这几组织呢都做一个修改。哎,这个呢,改成是叫24啊。这个呢,我们也把它改掉啊,改成这个叫难。嗯,把这个我们稍微的。再整短一点啊。
15:05
那这个往这儿拽一下啊。好,那么通过接下来这三个代码呢,我们这个代码呢,就是这样的一个执行效果,呃,覆盖了你的默认的初始化值啊,这就完事了啊,然后接下来我们看就是下边这三个方法的一个执行了,这呢是我们现在要讲的这样的一个重点了。好,下边呢,我去调用这个叫E的方法,每当我们调用一个方法的时候呢,我们说这其实就是一个新的战争。诶,所以这个时候的话呢,我们就会有一个E的方法呢,压入这个战力了。哎,这个方法呢,就叫做it。E是吧,就它了,那么这个方法呢,对应的代码回过来看一下,其实就跟我们这个里边定义的这几个是一样的哈,这些方案里边呢,其实这个细节呢,咱们就诶我不去说那么多了哈。诶什么意思啊,就是这里边儿你会发现呢,这个E的方法,我是不是又掉了一个方法。其实这个要一说的话呢,这个事儿还是挺复杂的,什么意思啊,就我调E的时候呢,E的方法里边我调烂方法了。
16:06
其实这块呢,我们就又得有一个。方法是吧。然后呢,我在eat里边,刚才看到我又掉sleep了,是不是这个sleep也跟着你过来。哎,都是这个细节,诶,所以这块呢,咱们就先简单一点哈,大家你就可以认为我这里边儿呢,啥也没写哈。咱们先说最简单的结构嘛,是吧,诶我在一的方案里边什么也没写,另外一个点呢,就是说我也没有定义变量啊。哎,就是没有局部变量,所以你调一下它呢。啥没有结束了,哎,所以这个方法呢,我就先放到这儿了。实际上呢,这个方法呢,我调完以后呢,结束了我接着调,你说在这个调sleep之前,这个方法会出去吗。嗯,那个我我在这空格一下,我到这个光标闪的这个位置。你说这个方法出去了吗?诶,这么一致吗?
17:00
不是我这意思啊,你说我掉了一完以后,我这个sleep是哎哟。对,我我用完没有到底。就用完了啊,竟然出现这么出奇一致大家的错误哈,全部都说不会啊。你看用完了啊。对吧。你看我这个方法调完了,调完是不是就用完了。你别等着说,你看我这意思话,我得等到这我才出去,用不着啊。它跟这个属性不一样。呃呃,属性不一样,或者我们叫这个may方法里边这个局部变量吧,这个局部变量呢,你看它还有效呢,为啥呢,因为我妹在这儿呢。我是先入的站,我这还在下边,你上面还压着我呢,咱不得说后进来的先出去嘛,你上面还没出去呢,我这肯定出不去,我出不去,我P啊不,我这X我肯定在啊。是吧,但是你这个E的方法已经执行完了啊。所以说执行完以后呢,这个E的方法就出去了,注意啊。他就出去了,出去以后呢,我们这个sleep方法是不是进来的。
18:00
哎,注意是这个细节哈。哎,这个大家小心一点,但是这块的话呢,呃,我呢就别给大家出去了,这样大家就看不到这个细节了,那我在这个呢,放到这儿以后呢,我给你打个叉哈。嗯。嗯,在这儿啊,哎,我打个叉叉的意思呢,就是这哥们呢,其实已经都出去了啊,诶E已经执行完了,哎光标已经到这儿了啊,然后接下来的话,我们去调这个sleep方法,哎,那这又是一个新的方法,那这个方法呢,又要重新的再去入战。注意,这时候E没有了,但是那个妹还在啊。你想妹不可能不在,妹要不在的话,那你怎么在妹里边调别的呢?哎,这呢,我们叫sleep。这个方案就放到这儿了,这个Li方法呢,咱们稍微在里边写了点代码。要把它打开哈,这个代码呢,我们看到有一个行参,这个行参呢叫hour,哎,那就理解成是你方法里定义的,这就是局部变量,只要是局部变量。就应该在站里边。那就在你这个sleep的站里边,所以这呢就叫是吧。
19:01
好,那么这个R呢,是我们所谓的叫行参了,当你调这个方法的时候呢,你传了一个六,这是算一个常量了,那么这个R呢,在这个位置是不是就有个六啊。哎,就放到这儿了。然后里边呢,假设我们也呃没有做特别细节的东西了,其实你要专门看它的话呢,相当于我们在这块呢,又调了一个新的方法是吧,这个方法呢。刻。哎,压入站。哎呀,这里边儿你把这个六呢,相当于在里边不是还输出了吗。哎,输入完以后呢,这个print出去了,紧接着呢,你这个sleep呢,是不是也结束了,也就出去了。在我这儿呢,就呃,没有去再刻画那个普烂的这个细节了啊好,那这个方法呢,执行结束以后呢,他呢就也弹出战了。那他就也出去了啊,这个我就保留了一下这个过程啊,这个出去完以后呢,接着我们再去调这个interests这个方法啊,这个我们从下一个里边借用一下啊。好,调这个interest这个方法的时候呢,同样呢,他还得再去压入站,这个时候对应的方法叫interest。
20:06
诶,这个方法啊,好,那么这个方法的话呢,同样呢,啊,我们回过来看一眼,它也有一个星参。他这个呢叫好笔是吧,好,那这个行参呢,我们在这个位置放到你对应的这个方法的战争里边。啊,这个呢,就好比了,好这一块呢,我们费了付了一个13的值叫编程。哎,把这个边注意哈。就像我这块这样写是。不准确的是吧,诶咱们反复的说这个事儿了啊,诶只要是。这个叫什么?引用类型的变量,其实都是地址是吧。诶,其实这块呢,真实的情况呢,应该是编程的这个数据啊。它放在字符串常量池里边,在JDK7以后,这个字符串常量池呢,就放在堆里边了,相当于在这块啊,有个叫字符串常量池的一个。一个池子,这个池子里边呢,放了一个叫编程这俩这俩这俩字符,诶有一个地址值是吧。
21:03
然后这个呢,Hobby呢,作为引用类型的变量呢,它就记录了一下这个地址值,呃,这个地址呢,我就指到这儿来了。哎,其实是这样子的,但是我现在话太多吧,大家可能有点懵啊,所以还是那个意思,咱们先暂且理解成就放这儿了啊。啊好了,那这呢是我们写了一个叫诶编程,然后你这里边呢,你就看你还有没有别的东西了,在我们这个题目当中,我里边又定义了一个变量。啊,只不过不是行参了啊,是我们这方法内的啊,那如果呢,就考虑它的话呢,这个阴符儿你是不是就应该在呃下边这块再整一个。哎,叫infer了,这个infer的话呢,呃,对应的信息内容我们说哎,我的爱好是啊,哎,那你这块呢,就写的长一点呗。哎,这个,那你就写,哎,我的爱好。哎,是哎,编程。因为你要拼接后边那个hobby嘛。
22:01
哎,这个稍微的有点长,往上拽一点吧。那这呢,就我们定一个新的变量,呃,然后呢,在里边你再看干啥了,输出了是吧,诶输出以后呢,其实这块还有一个新的方法,跟我们刚才讲的这个一个道理啊,这个printline呢也会。呃,压入站,然后呢,输出完以后呢,他出去的,然后呢,这个方法呢,也仅诶这个方法,注意它最后有一个返回值是吧。它返回是个ABC是个常量。啊,当然你可能返回这个in啊,你要返回常量的话呢,这个常链呢,其实它也需要。诶,其实入到自符串常量池里边了,把这个值呢返回,返回的意思是什么呢?就是当我们这个方法执行结束的时候。我是不是要出去了?我一出去呢,首先你没有了啊。然后呢,这个return呢,咱们通常会说,诶,它呢,会把这个方法的返回值返回给方法的调用者。那么问这个方法的调用者是谁?
23:02
大家都会认为是P是吧。其实不是P。诶,这个方法的调用者是谁呢?是你在哪一个方法里边调的它。诶,你看啊,我这个已经挂掉了,这个已经挂掉了,这个呢是现在要挂掉,他一挂掉的时候呢,返回值,现在在站里边是不是只有妹。没有前面这俩是吧,所以他其实返回给谁呢?返回给may了。哎,注意反没了,那反伪这调者调者你你想干点啥,哎,咱们可以做这个事了。这是不是咱们的妹啊?好,我现在通过这个P1。第二,我调了个interest的时候正常,比如说咱们写个叫编程了哈。哎,返回给我,返回给我,我是不是就可以拿一个字符串来接收了。哎,我就这样了。哎,接手以后呢,你想干什么,那你就干什么,比如说你想输出我就输出一下。这个呢,是不是在may方法是吧,所以把may呢看作是它的这种调用者啊,咱们指的不是说呢,拿谁来调的,因为你返回给PE没有意义哈,是返回到你前一个这个战争这里边了。
24:05
诶,那这呢叫in for,那就意味着我们这个出去之后呢,诶在这个位置哈,相当于你下边呢,是不是又来了一个in啊。这个info的数据呢,就是你上面这个返回的这个数据。哎,就是我们这个信息CTRLC,我就诶拿到这儿来了。哎,那注意这仨呢,都已经出去了啊,所以这个数据呢,我们在main里边呢,就接收到了你前一个方法的返回值的数据。好,那么我们接下来这个没方法呢,也结束了,那他呢就也弹出战了。他也出去了,然后呢,呃,他一出去的话呢,这个P1呢,不跟着也就没了吗?这个指针也就没了,这呢就没有任何指针指向他了,后期呢,扎垃圾回收器的话呢,一判断你没有指针指向,这也是垃圾,是不是也就回收掉了。哎,注意就完事了。哎,那你注意啊,我这个JC呢,刚才我说的是回收这个堆,我说JC回收站了吗。没有,所以呢,在里边是不存在的。
25:04
哎,注意这个J些呢,实际上是两个词啊,一个呢叫garbage collector,叫垃圾回收器,也可以翻译成呢,叫garbage collect叫垃圾回收行为。所以呢,我说这个站里边没有JC啊,我指的是垃圾回收行为,哎,我们用JC去回收啊,这时候我说的JC呢,是垃圾回收器啊。诶,我就混着用了啊,站里边不存在着JC,站里边只存在着入站和出站,这个是自动实现的。你用完了就出去啊,一用你你就进来。哎,这个呢,就我们说的整个这样的一个过程,这儿呢是一个难点。大家呢,不着急去掌握啊,你只需要知道什么呢?诶,我们讲的方法的基本点就行了,什么叫基本点呢?我在一个类中我们定义方法了。呃,基本的格式,哎,我们前面讲过了啊,大家需要去熟悉的,然后定义完以后的话呢,你只需要知道我们在用的时候呢,需要通过对象来调,然后调的时候呢,你调一次就执行一次。啊,有返回值,你愿意接收你就接收一下,不想接收啊,你说我用不着,用不着,那你就你就不接收是吧,你想打印就打印就行了,这个呢,就它的整个调用过程,这个是大家需要熟悉的。
26:10
除非什么时候我们现在必须要去懂这个事儿呢,哎,就是呢,我们现在代码呢,执行的结果跟你想的不太一样。诶,不对呀,这怎么回事儿啊?诶,来画画内存图吧。哎,这个时候,哎,我们再了解一下这个内存的结构啊。
我来说两句