00:00
大家好,我是上微谷H5学科讲师刘志远,在程序员节到来之际,给大家分享一道面试题,哎,那我们这道面试题它的主题呢,是一个叫做值类型和引用类型的传递,好,首先呢,我们在这里呢,定了一个构造函数,哎,因为我们看到函数名首字母是个大写,所以它是一个构造函数。然后第二个呢,是一个普通的自定义函数。然后我们再往下看,因为前两个函数如果我们不进行初始化或者调用的话呢,它是不会执行的啊,首先第一步呢,我们在这里声明了一个变量。然后给这个变量new person,也就是进行一个我们对象的一个创建,对吧,我们的对应创建的几种方式啊,其中一种就是以构造函数的形式来进行创建,在此刻呢,我们进行一个new person。诶,传入了三个实际参数,分别是张三啊,18岁,还有1000块钱的薪水。哎,那此时对应的呢,我们的构造函数当中的形式参数呢,也是name age,还有salary。
01:02
好,那此时呢,呃,这句话当执行的时候呢,在我们的内存当中呢,会进行一个,哎,我们来画个图啊。哦,那我们说了。我们对内存呢,我们大致可以分为两块啊,那一个叫做占内存,一个叫做堆内存。好在站体当中呢,我们一般情况下是一个直类型的一个类型的一个存储。那首先我们看到第一步是一个VRP。哎,那这是一个变量,所以在这当中呢,首先我们先开辟一个空间。好,那此时呢,我就把刚才这个代码我们给它复制过来啊VRP。哎,是这一步。然后后边的new person,我们说创建对象,对象是一个复杂类型的数据。
02:03
保存在当中,所以在这儿呢,我们来再画一个。那我们这写一个啊,这是咱们的叫做站。占内存。这是堆内存。OK,那我们说当new person这一步的时候呢,在我们的对当中呢,开辟这个空间存储的就是我们这个对象啊,所以此时呢,我们把这句话给它复制过来啊,CTRLC。好,那它们俩之间是有什么联系呢?我们说,哎,我们的变量存储的是对象在堆内层当中的地址。那也就是说呢,在我们内存当中呢,我们是分为一块一块的。对,那对内当中呢,我们通常情况下呢,也是一个地址,那我们这块呢,就用一个16进制数表示啊0X,我们这写一个随便来一个110啊110。
03:07
那这是在我们对当中存储的这个对象的一个地址。那在我们的战当中呢,这个变量当中保存的就是这个地址,所以它们之间呢,是靠它来进行关联的啊。好,我在这儿呢,我来来。复制一下啊,然后呢,CTRLC。好,那我们也可以换句话说呢,是我们当前在当中的地址呢,指向的是对列最终当中存储这个对象的地址啊。好,然后呢,咱们继续往下走。那首先我们会打印一下P点。
04:01
那也就是说呢,哎,那这当前这个P啊,我们说这边保存是个对象。那我们再看构造函数当中呢,有name这个属性,所以此时呢,那我们当初始化的时候呢,就是张三啊,对应的就是那个name,所以此时打印的时候呢,这肯定是一个叫做张三啊。张三,OK,然后再往下啊,我们看到我们调用了这个普通的函数,那调用这个普通函数的时候呢,我们这边有一个参数叫person。那这个person呢,是一个形式参数。哎,那我们把P啊P。进行传入。那就是我们把当前这个变量进行传入。那当进行传输的时候呢,那我们调用F1的时候呢,那此时呢,就应该进到我们的函数体当中。哎,那我们说这个形式参数啊,在我们函数的当前作用下啊,它是。应该帮我们声明一个叫person的这么一个变量。
05:00
对吧,哎,我们的变量会进行提升的,然后呢,等于什么呢?等于的是不是就是我们传进来这个P呀,哎,传来一个P。好,那传入这个P啊,我们说它保存的是什么呢?是我们对象啊,在对内存当中的地址,也就是我们刚才看到的这个什么呀,叫做0X110对吧。好。那我们现在换句话说呢,现在两个变量啊,都指向同一个堆的地址。那我们可以这么认为。这个VR person,那应该首先是在我们的战略当中呢,又创建了一个变量,或者说呢,又开辟了一个空间来存储我们这个微量里边的什么呀值。好,此时呢,我把。这句话呢,我们也给它复制过来啊。
06:18
然后呢,那我们说。把屁啊屁。变量当中的值赋给了person。那也就是把这个0S110呢复制给P。也就是对应当中的这个地址。好,那此时我们可以认为啊,我们现在两个变量指向的都是同一个对象啊,所以呢,我们这条线呢,也是指向了这个。
07:00
好,这儿呢,我画一条线啊,分开。这是我们一个对象存储的。好,然后再往下走啊,那此时呢,我们用看点log来打印P点。打印p.name。好,那此时我们在这个。函数的内部啊,我们来看一看,我们又重新啊,给我们的VP的name重新复制一个李四。那此时我们说了两个变量指向的都是同一个对象。那修改的就是对象当中的这个name。啊,所以在此时呢,我们的。内啊,应该等于什么呢?应该等于单引号第四。发生变化了啊,发生变化了。那我们这儿呢,也可以认为是一个什么呀啊,认为是一个Z点内部也好,或者是Z啊name也也行。
08:04
好,然后再往下。我看啊,Person等于new person。那这句话什么意思呢?首先这个person变量啊,肯定还是我们的形式参数这个person,或者说是我们局部变量当中的这个啊,函数当中的这个局部变量,然后当在new p的时候呢,是不是又相当于什么,相当于在我们对中重新又创建一个对象。所以此时呢,在堆当中呢,又应该重新开辟这个空间。那我们就跟在这儿啊,站起来。好,那当然重新创建这个对象呢,那这个地址呢,也会重新开辟一块。所以在这呢,我们写一个啊,叫做0X右右右。那当重新创建一个person对象的时候呢,那我们可以看到啊。
09:00
在这里边儿,让我们的person去重新指向一个新的对象了。那也就是说刚才我们这两个指向都是同一个,因为我们刚才是把P复制给了person。那此时呢,这条线应该发生变化了,那也就是刚刚我们创建这个person呢。之前指向这个person。啊,现在发生变化了,又指向他了。但此时。我们应该这条线这么来画,然后刚才的这条线呢,我们应该用橡皮给它擦掉,表示它已经不再指向第一个创建那个对象了。所以就没有他了。好,那此时我们可以认为啊。Person指向就是第二个对象,刚才的P指向就是第一个对象。那我们再往下看。那这句话上打印的是什么呀?P点内,那P点内P点内是谁呀?那P不是还是它吗?它质量是刚才这个第一个对象,Person才是第二个对象呢,那所以此时我们的person发生变化了,和我们刚才的P是没有关系的。
10:11
所以此时我们再访问P点内。是谁呢?是我们刚才被改变的这个李四对吧,因为进来的时候,当两个人同时指向的时候,我们这个图也能看出来了,是被改变了,那改变以后他马上的指向又改变了,改变成第二个对象了。所以啊,那我们最后打印的这个P点呢,是我们被更改之后的四。哎,所以跟AA也是没有关系的。那这就是什么呀?这就是我们值类型和影类型的在内存当中的,呃,一个存储方式和之间的一个传递方式。
我来说两句