00:00
Hello,大家好,我是上规谷家外医学课的讲师柴林燕,今天呢来给大家分享一道面试题,好,大家可以看一下题目,可以暂停一下视频,然后呢,自己分析一下这个代码的运行结果是什么。好,我们来看一下你的运行结果对不对啊,你分析的运行结果对不对呢?我们来运行一下这个代码。好,这里呢,结果呢,I等于一,ST等于哈,那么等于200啊,然后呢,这个数组啊,结果是这样子的,然后呢,My date啊里面的结果。我们看一看哪些地方啊,这个没有考虑对我们来试一下啊。分析一下这里的考点考了什么?其实这里呢,主要是两类考点啊,第一类就是方法的传参机制,就Java当中它的方法存仓是怎么传的。
01:04
以及我们有特殊的一些类型,比如像string类型啊,包装类类型,他们的对象有不可变性。那么我们给大家画一下图啊,看一下更清楚一点,我把这个代码呢,复制一下放到了我们的啊,这个画图工具里面。这样呢,我们那就不用来回切换啊,这样呢就看得更清楚一点。这个字体呢,我们稍微呢调一下啊,调小一点。好,这样的话我们应该就能看到全部的代码了啊,马上一点。接下来我们来画画图啊。首先呢,我们说交讯息当中啊,是存在了这样的这个几个区域的啊,内存里面什么有方法区呀,有什么这个呃堆栈呀什么之类的,那我们这道题涉及的是哪些这个区域呢?好,我们来看一下这五个变量,我们把它称为叫局部变量来着。
02:12
那局部变量呢,我们呢,就是按照方法。来分配区域,比如说我们啊,有这样的两个方法,第一个是主方法。主方法好,我们呢把这线呢粗一点,另外一个它其实这里还有另外一个方法叫称着方法,这些也是局部变量,因此它会有另外一块去,就局部变量是以方法啊这个为分割点的。那么因此我们啊这个呢,我们把它叫占方法站站当中。好,那么我们呢,来依次来存储一下有I的值,对什么类型的呢?这个int类型的int类型的I,那我这里呢,就是存进去里面是一好str。
03:10
是是菌类型的。那么我们这里面呢,有个str,那么它因为是一个引入数据类型的数据,那么它存的是哈,那这个哈是怎么样子的呢?好,我们呢,因为哈呢,它是一个常量租车常量,我们把这个呢叫做常量池。产量池,它存在了这个产量池里面哈。好,那也就是说这个str,我们呢,就相当于是指向他了。他存的是他的地址,那么这个地址是什么?我们啊,这个随便写一个,咱们也不知道他具体是什么,假设他的这个手地址是这个存那个地址。好,那么这个nu nu呢也是一样的啊,那么我们的nu也是一块这样的区域。
04:04
Integer。Inte啊,然后呢,那这个当中啊,Inte呢,也是一个对象包装类对象。好,那么它在这个,呃,对,因为它不是我们缓存对象的范围内,缓存对象的话是这个,呃,127吧,这个正数的话到127,那我这里呢,不在我的范围内,所以呢,我们在这个堆当中。好,我们这个里面啊,就是把它用来叫堆好,那么这个地方呢,就是引用的是我们的这个区域,那么这个里面呢,存的是200。那么也有个地址,那么具体是什么不重要,就是知道他这个地址值就可以了,好,这里呢,有瑞又一块区域了。对吧,那这个rra呢,是一个什么类型的呢?一个数组类型叫做rra,那我们知道数组名里面存储的是我们的首地址,好,这个数组我们在堆当中呢。
05:08
五个格子对吧。嗯。好,我们看一下。好,五个格子分别是12345个元素,那么下边呢,依次是零一,它也是存的是首地子来着,那么我们也给他一个。那我们把它叫0S,在这里面还有一个就是my date my date也是啊一个这样的对象,那我们呢,在这里吧,扭一个。MY,它里面呢,有一个成远变量,就是我们说的属性对吧,那么这里面呢,有一个in特A等于十好,那么它呢,哎,我们呢,放在这儿吧。
06:13
局部变量啊,那么这个类型呢,叫my date类型,类型名字呢叫MY。好,那么它呢,指向的是这块区啊,这个呢是指向他啊画一下。这个的话是从我们的啊这一步,我们划过绿色的框框,就到这一步啊为止,我们的内存的存储情况是这样子的。好,接下来呢,我们要去执行了,比如说我们要执行对吧,哎,执行哪一句呢?我们要执行这一句了,Change。那么执行它的时候,我们发生了什么事,它导致了趁着方法调用的时候,就会给趁着呢开闭化空间,那么这里面呢,有很多局部变量了,对吧,这些局部变量又要去分配,那么分别传的是什么值呢?好,我们一起来画一下,来画下这个时候啊,我们呢就会啊也是一样的啊第一个。
07:13
有一个叫特的JT的J这个。他是。谁给他负的值呢?好,我们这个当中呢,给他呢,画一下这个线。I给这副值。那么这个时候I给这赋了什么值?是赋了什么值,那么我们这里面它是基本属于类型,好我们这个当中啊,就要说一下这个船参,我们说当我们方法的这个仓船基制行参是基本数据类型的时候,我们传的是数据值。也就是刚才啊这里提到的。这个,那我们给他的就是一个一。一就是我们把这个I的一给了这个J。
08:02
出去吃好第二点,那我们呢,又str也发生了,船参给了谁呢?这个食参str给了行参S这几个就叫行参了,对吧?那我们这个呢,叫行参列表。行参列表,我们上面这个呢,叫食参列表,那我们食参给行参的。赋值对吧,那我们说了这个实参啊,注意下面型实参给行参赋值,那么如果说基本数据类型,那么是数据值,如果是引用数据类型啊,那么我们是什么呢?好来看一下,如果是引用数据,力行传递的是地址值。哎,什么叫地质值好,那我们看一下啊,也就是我们这个地质值,也就是str给S的是地质值,好,因此我们这个地方画图就变成这样子了。
09:00
好,这个里面呢,就是string形参S俊啊STNG,也就他给他的是地址值,那么就是0X1234,这么一给的话,就意味着我这个也指向了跟你一样。一样好了第三个我们来看一下,第三个none给了这个N,那么N还是引用数据类型对吧。一样的形数据类型,那我这个当中呢,就是第三个,那么就是inte inte,那么我们这里呢,N,那么我们给它的也是地址值0X9090,因此我相当于呢指向它了。没问题,好,然后呢,同样的我们这个当中,接下来是数组AR。好,接下来我们呢,画一下数组。
10:01
那么也是一个int的数组,我们叫A是吧,数组A,那么这个时候啊,这个A我们。负的是什么值呢?给他的是地址值0X8989,那意味着我有了地址值,我就可以找到这个地方。好,最后呢,还有一个MY。给M的是什么值呢?那么根据我们刚才的经验啊,那么。有一个变量叫做my date m,那么这个M呢,它得到的也就是麦里面的,OK,这里我们刚刚没有地址值,那我们这里当中给他敷一个。比如说7878,那么我们这个里面就相当于是AX7878。好,那么也就是说这个呢,也就指向的是我们这个。对吧,好没问题,我们刚才这个当中啊,负值地值值跟这个完成了,接下来我们要进行下一步操作,好我用粉色的这个,接下来我们这。
11:10
加等于一的时候。这加等于一,因此我们要在这变量上面进行修改,好,这个时候我们改的是注意二是这改的是它加等于一等于二。然后呢,好,这里呢,接着第二步,下一步啊,我们再换一个颜色。这一步。这个S加等于word,那么它这里呢,有个特殊的地方,我们说字符串对象不可变,不可变啊,那么就是它这个当中非常非常特殊特殊类型,像string对象,包装对象,它是不可变型,什么意思啊,意思就是说我们如果说要改变。他本来是要去啊这个拼接的,但是一旦发生拼接,它会产生一个新的对象。
12:06
拼接完,因为它还是常量,跟常量拼接,仍然在常量池里面,Hello,他会得到这样一个结果。当然这里面有一个单独的这个word啊,常量对象,那么这个里面的word也是有的,那么他得到一个hello word的结果,谁指向它了呢?它把它重新复制给了啊,注意S,这相当S等于S加上这个,所以还是复制给SS,那么在哪呢?这是因此S不再指向我们刚才的这个了,而是S呢,要重新指向它了。因此相当于这个里面的被改了,改成什么值呢?我也不知道,我给他们就是赋一个值啊,那么负一个什么值呢?比如说9999,总之反正不是原来的零面30。那么以此类推啊,这个也是一样的,一样的,它会产生一个新的对象,那么比如说它是加一呢,就是201了,201是一个新的对象,也是在堆里面,但是它这个当中指向的对吧,一样的不再指向我们刚才的这200了。
13:17
而是指向什么呢?就像这个了。新。那也就是这个里面呢,把它给去掉了。换了。那么我们呢,是一个什么值呢?我们给它一个值,比如0X8888。好,那么这个数组啊,又发生这个变化了,那我们呢,接下来比如说用这个。绿色的啊数组,数组这个呢不太一样,数组,因为我们这个例子改的是改的是元素。A0,那我得通过A0是什么呢?通过这个地址找到A0往下找,找到这儿。那你就改的好,A0改了,把它改成了二。
14:03
对吧,改成二。剩下的我们红色可能更清楚一点,改成二把它改了。他通过这个地址。A,这个手地址。找到了A0啊,把它改掉。同样的是吧,哎,我们最终比如说这个蓝色的这个部分点ma一样的,我通过一样可以找到我们这个当中点am对象没变,M对象找到它的这个A把它改掉了,改成了多少呢?11。啊,不是把A改掉,是把这个A的值改掉啊11。好了,最终我们等我们把这个趁着方法执行完以后,整个的。这块区域就相当于是没有了。那么剩下的主方法当中,我们再来回看一下,哪些变了,哪些没变?I变了吗?没变还是E?
15:03
Str仍然指向hello,没有动。Hello,没有动,它这块是产生新对象。那没有变,还是只要200?好,AR瑞这个还是要这数数,但是因为这个元素被改了,所以说它打印出来的是22345,同样的我们的这个啊卖点A,那么我们通过找到这个呢,因为他刚才这个A的属性被改,所以说我们的结果是这样子,前面这三个都没有变。只有这两点,那么前面一这个不变,是因为基本属于类型,我们呢,哎,这个是单独的一份,他地址没有告诉我,那么我们是单独的,所以没有变,那这两个呢,虽然告诉我地址,但是它因为有个对象呢,不可变性,所以导致呢,我们一变化会产生新的对象,因此原来对象也没有变。但是像数组啊,还有其他的因数类对象,它属属性修改,或者它的元素修改是会变的。那么因此我们呢,就是呃,要注意啊,这个基本数类型,引用数据类型,还要看一个特殊的类型,这个本来应用数据类型的话,修改属性也好,或者说什么也好,那么它是会改,但是因为它是产生新对象,跟原来对象没关系了,你地址给我,但是我操作的不是原来对象。
16:18
这个是我们方法传递机制当中啊,容易这个。出问题的地方。好。那么今天呢,我们就讲到这里,谢谢大家。
我来说两句