00:00
回来的话打个一,各位来,回来的话打个一。好嘞好嘞,那么接下来咱们再接着往下看了啊,那么刚才呢,这个题目我觉得大家可能还是没有听太明白啊,包括那个林栋,我觉得你可能还是没有听太清楚,我们这个程序的一个执行原理是什么呢?就是说我int X等于100,然后Y等于X,把X传给Y,那么传过去指的是这这这是怎么传,用等号给它传是吧?那传是传的什么呢?实际上是把X保存的这个100怎么着啊?
01:15
复制了一份干什么呀?哎,传给了Y是不是。哎,那我问大家一个问题,这个Y加加对X有影响吗?各位,这个Y加加,假如Y加加X不许加加,Y去加加X变不变。不变啊。是不是你你对Y进行加加,你你管不着人家X啊。是不是,那你同样一个道理啊,那可能就是说我起这个名可能起起起麻烦了是吧,我应该换个变量名呗。
02:00
就一下变量名,我故意给你刁难一下,是不是让你感觉一下你就懵了,那要改成K呢,这是K加加输出K。这样理解吧。Int I等于十,然后I传给了A方法。把这个I传给了K。是不是就相当于把X付给了Y啊?那K加加呀,你对你对你I有什么影响啊。是两个I啊,这个I和上面那个I不是一个I,那能怎么能是一个I呢?俩局部变量,我喊了半天局部变量,局部变量,怎么还能不理解局部变量呢?局部变量是啥呀?就是在你方法体里有效方法结束之后就释放了内存,你这个I和你这个I不是同一个I啊。嗯。
03:00
所以你这个值是11,上面这个值还是十啊。好,那么接下来咱们继续往下看啊,咱们再写一页代码。来点来点,这个故意刁难一下大家的啊,大家看一看,这次呢,我们这个代码这样写。注意听啊,注意听test。二啊,然后呢,Public static void主方法加上去,然后在这块呢,我们。看一下啊,假如说我这里有一个类,这个类呢叫person person啊,然后呢,有一个age这样的一个属性啊,这叫年龄属性。年龄属性啊,成员变量中的实例变量。啊A,然后呢,接下来我在这个位置上呢,有一个方法,这个方法还叫A,只不过参数啊,它不是一个int类型的参数。
04:07
然后呢,这个呢。嗯。就方法上这个参数,我也我可能也得给大家说一下。就这个参数可以是什么,还记不记得我们之前讲方法的时候怎么讲的。关于方法的形式参数列表。对吧,那这个参数的类型可以是任何一种数据类型,对不对,可以是基本数据类型,也可以是什么,哎,引用数据类型是吧?哎,就是方法的参数啊,方法的参数可以是基本数据类型。也可以是什么呀,引用数据类型。只要是合法的数据类型就行。所以我们参数类型就写个person类型。行吧,啊,比如说person类型啊类型。
05:01
P点什么呀。P点什么呀?P是一个类型,什么类型啊person它里边有age吧,所以p.age干什么呀?佳佳,然后呢,system.out.print打印输出什么呀,P点。啊,输出这个年龄,那么这块呢,我就写上ADD方法当中的一个p.age接下来我在这块干什么呢?我说person啊呀,New一个person。人啊,定完之后呢,p.a。什么?然后A方法把P作为参数干什么来传进去,然后接下来system.out点打印输出我们的方法当中的这个p.H那这两个结果。大家可以分析一下,我觉得可以画图啊。我觉得这样吧,给这个给大家这个几分钟时间时间吧,大家画一下图,不要猜啊,你不要去猜,你画图好吧。
06:05
好,各位啊,从这一行开始往下画。一行一行画,程序执行到哪儿画到哪儿,程序执行到哪画到哪,千万别越界。一步步画,好吧。一步步画啊,就是这个地方有个PP不是传进去吗?当时怎么说的。P传进去是怎么传的是吧?P变量里面保存的这个内存地址P,你比如说int I等于十,是把十复制一份。是不是传过去啊,那如果person这个代码是person p等于0X1234,那么你是不是应该把0X1234复制一份作为参数,呃,传过去啊。是不是一个道理啊?是不是,哎,你你你你你你你研究一下,我给大家这个五分钟时间吧,大家画一下图好吧,画一下图啊。好了,同学们,咱们接下来,呃,回来一下啊,回来一下打个一吧,打个一现在好像还没画完是吧。
07:11
来咱们咱们画一下啊,画一下这个图。之前画的是参数传递一啊。然后呢,这个我就先关掉了,然后接下来我再打开一个新的,然后接下来我这边给他先保存一下。我们叫参数传递二。嗯。嗯。咱们来看一下啊,怎么画这个程序啊,怎么画,首先的话,我们这个呢,有堆是吧,是不是也应该有站呀。所以这块呢,我们就简单化一下啊,假如说这个呢,就是我们想象当中的堆内存好吧。然后呢,这个呢,我们就是想象当中的占内存啊,假如说这个就是占。
08:03
啊。好了,那下边这个呢,咱们给它,哎。拿掉啊拿掉,那么接下来呢,咱们这个程序先执行笨方法是不是。那么闷方法执行会压站对吧?哎,会压站啊,所以这块呢,应该是一个闷方法。战针那么闷,方法战针接下来呢,我们先执行等号右边new person啊,然后呢,付给P,这P是个局部变量,对不对,这是在方法里边的啊,等号后边是一个person啊,那person呢,我们这块呢,应该是把它,呃就在这个程序里边,是不是就这个,这个A值是不是等于零。对吧,哎,所以把这个person的对象给它,给它创建出来啊。来我们这块呢,这是一个person对象。类型的对象啊。Person类型的对象,然后接下来呢,这个里边呢,应该是有一个什么呀,Int类型的age是不是。
09:06
啊,你就用这个吧,或者用这个。啊,In age啊。Age。是不是,哎,这个age啊,这个age呢,里边这是个变量呗,是吧,里边存的是一个什么呀,存一个零吧。是不?因为这个程序上说是六嘛,对不对,所以你这边是零嘛,负给一个P,哎,拿过来。拿过来之后呢,它放哪儿呢?它是个局部变量。所以。在。对吧,然后这儿呢,应该是有一个什么呀变量。这个变量就是这个P变量呗。哎,批变量里边保存一个内存地址呗,就是这个整个这个对象内存地址啊。0X1234得了。那么这个地址呢?去指向谁呢?这个地址其实指向的就是这个对象了。
10:04
对不对,那就是这个对象啊。然后接下来呢,这个程序啊,继续往下走,就p.H等于十。P是谁呢?它点H是它等于十,也就是说现在呢,他把他把这个零呢,已经改成了十。啊,把谁改了呢?把它改了。对吧,现在是十了,那么接下来这个程序继续往下走,那应该是ADP。那么A实际上相当什么呢?就相当我们里。是不是来调这个方法。那么调这个方法呢,就涉及到参数传递的一个问题,就相当于把这个P也要传进去。传过来,要把这个传过来。传过来调这个方法,调这个方法要压站啊。是不是,哎,压榨。来这个颜色我改一下啊,改成蓝色吧,哎。卡在这,但是你这个P参数,反正传的时候是怎么传的。
11:01
哎,实际上是把谁呀,还是刚才那个道理吧,是把0X1234怎么着复制一份吧。是不是把它复制一份。传给A啊。啊,就是怎么传,就是怎么怎么赋值,就是Java中,Java中的Java中变量赋值,变量赋值的原理是什么。永远都是一个规则,哪个规则将盒子中保存的那个?直。将盒子中保存的那个。是。是吧?复制一份吧。对不对。穿过去吧。啊。不过这个值。可能是。一个数字100。
12:03
也可能。是一个对象的什么内存地址。你想想。我这样,我调这个ad这个方法。是不是把这个P传进去啊,P传进去是怎么传,传什么。传的是你P变量里边保存的这个东西,复制一份对吗?所以他在传的时候怎么传?就这个这个这个ADE方法调A方法是怎么传的,就关键是在这儿。调用ADD方法,十传过去一个P。怎么传的?实际上是将P变量中保存的。
13:00
0X1234复制一份。传过去。是吧,同等道理吧,也是复制一份吧。对吧,哎,复制一份传过去,复制还是那句话啊,复制一份这个盒子,这这就这个东西。用这个表示吧。就这个东西它会复制一份传过去,那么这个时候呢,方法调用就会压站。方法调用就行,调用ADB方法了,所以这个时候就会压战嘛,那这就是ADD方法的战争呗。对吧,哎,这就是ad方法战争。ADD方法,战争。那么这个ad方法战争有了之后啊,大家注意了啊,注意了,那么ADD方法这一块是不是有一个局部变量。这个是不是局部变量P是。Ad方法的局部变量对不对?好,那这样的话是不是就相当于在这个地方有一个PP呀。
14:09
对吧?哎,那你person p它是个盒子呀。这个P变量里边存的是什么呀?对吧,是因为你这块是不是调ad的方法,是不是把这个P传进去了,传的是0X1234 0x1234,是不是这个盒子里边保存这东西复制一份传给他了,所以是不是传过去的也是在这是0X1234啊。一样的吧。各位这个理解不理解,就为啥这个盒子里边存的也是0X1234。是因为我这个盒子里边是不是0X23,是不是把0X12123的复制了一份传过去了。所以这个盒子里面存的是不是也是0X1234。
15:01
好,那我问你。再问大家一个问题啊,我看能不能问问懵啊,来,各位在不在,在的话再问一个问题啊。我问你这个P和这个P是同一个P吗?还是两个屁。这个P变量和这个P变量是同一个P吗?还是两个P呀。记住我之前我给大家讲过啊,讲过什么就是这个变量啊,它是个局部变量,这个变量它也是个局部变量。啊。这个变量它有没有内存地址,就是这个盒子有没有内存地址。这个P。
16:00
是局部变量。啊。这个P呢,它也是局部变量吧。对吧。注意啊。这个P和这个P不是同一个P,是俩P啊。是两个P,但是这个P里边保存的这个东西传过去的时候是把这个0X1234复制了一份传给了他,虽然两个P不是同一个P,但是这个这2P里边保存的这个东西是一样的。对。实际上是把P传过去,是把P变量里面保存的这个东西复制一份。传过去了,那导致最后的结果是什么呢?是这个01234,既然这个地址指向他,那我这个01234也是指向这个对象。
17:04
它指向同一个对象。对吧,因为这个地址传这个021234,传过去之后呢,导致这个PPI里面保存也是01234。0X1234啊。那么这个时候呢,你的程序是怎么执行的,是不是看你调ID方法了吗?对吧?这个代码不会执行吗?会执行下边这个程序对不对?那这个时候p.H加加,那这个p.H加加会导致什么呢?会导致这个p.H干什么加加,所以这个结果就变成了什么呀,11。就很神奇的一件事啊,11拿过来,你看变成11了。那让它变成11之后呢,接下来我们在这个位置上,那肯定输出什么呀,输出11喽。结束了吧,那如果输出11结束的话,结束掉了啊,那结束掉的话,那么接下来这个程序是不是就继续往下走啊。那往下走,我们拿这个代码是什么?是不是p.H啊。
18:01
好,这个P是谁,是这个P吧,好,那我问你是不是这个P。这个P指向的是不是这个对象。p.a是多少,这个位置是不是也就输出也是11啊?对吧,因为你上面的这个,你把0X1234P变量保存的这个值传过去了,复制了一份传给了这个A的方法,A方法虽然这个P和这个P是两个P,但是这个P里边保存的这个这个这个这个东西啊,和我们这个P里边保存这个东西是一样的。是一样的,也是同一个道理,各位不要想那么多啊,就是说。方法,调用参数传递跟数据类型没关系,我再强调一下啊,实际上都是把变量里边保存的那个东西复制一份传过去。你记住这个规则就行了。啊,记住这个规则就可以了,那这样的话,我们通过这个P去操作这个age的时候,那么通过这个P在获取这个age的时候,实际上这个对象是同一个。
19:01
对象是同一个啊,所以导致了我们输出都是11。来javactest2.java,然后Java去运行,TEST2走,大家看两个都是11,所以说画内存图有什么用啊。画内存图有什么用啊?哎,有这个用啊,就有这个用来,大家记住一个规则就行,各位啊,记住一个规则就行,Java中关于方法调用时参数传递,实际上只有一个规则。不管你是基本数据类型还是引用数据类型,实际上都是实际上在传递的时候啊,在传递,在传递的时候都是将变量中保存的那个。值复制一份传过去,你只要搞定这个就行了。
20:02
啊,什么意思呢?In特类型X等于一型Y等于什么呀,X对吧?哎,Person p呢,P等于什么呀,你有一个person。是不是,哎,而这个呢,实际上是0X1234,那么接下来在这呢,有一个person p2,那接下来P1给他传过去,实际上是怎么怎么着啊怎么着啊,各位是怎么做的呀。啊。怎么做的?怎么附上去的是把什么把X中保存的什么一吧,是把X中保存的这个一怎么着,哎,复制一份怎么着。哎,传给谁,传给Y吧,是不是同样道理传给Y啊,是把这个复制一份啊,传给Y啊,那同等道理,这个是不是把这个复制一份啊,P1传给P2,实际上是把P1里边保存的这个东西复制一份传给了P2嘛,所以这个是也是这个呀。这个如果也是这个的话,你0X1230X指向的对象不同一个吗?你通过这个操作,呃,通过这个操作都会影响到同一个对象。
21:02
都引导同一个对象啊。好,这是把什么呀,把这个P1吧中保存的什么0X1234怎么着,哎复制一份传给谁呀,传给PR。X和Y啊,X和Y都是两个什么局部变量吧,好,那这边呢,P1和什么P2都是两个什么局部变量吧,哎,局部变量,局部变量局部变量啊,这是两个不同的变量,这是两个不同的变量。这个编列里面保存的是一,而这个编列里面保存的也是一,这两个一。这两个一不是同一个一啊,好各位,这个P1里边保存010X1234 p2里边其实保存也是0X1234,但这个0X1234和这个0X120X1234是两块不同的内存空间,各位啊,但由于你的保存的信息是0X123,导致我们最终指向的那个对象怎么着啊,是同一个对象。
22:03
啊,是同一个对象,你0X1234这个地方其实也有一个0X1234,因为你是把上面这个0X1234复制了一份给了这个P2,所以这个0X1234和这个0X1234在内存上是两块啊,是两块,但是呢,由于你这个记载的是这个地址,这个地址是堆内存中对象的地址,如果你是0X123,这个是00X1234,那就相当于怎么着你指向的对象是同一个呀。对吧,啊是这个意思啊,是这个意思,P1传给P2,实际上是把0X1234复制了一份。明白吗?复制了一份啊,给谁了?给P2了啊,就相当于你和你的媳妇儿手里呢,都有,都有你们家大门的钥匙对不对,哎,你一把你媳妇儿一把是不是,哎,两把钥匙打开的是同一把锁。明白吗?这个理解吗?
23:00
就你和你媳妇儿是吧?啊,都有你家大门上的钥匙。钥匙是两把。明白吧啊,但是都可以打开你家的大门啊。明白吧,就这个意思。就这个是0X1234,其实P1呢,付给P2就相当于也是0X23,这是你的钥匙,这是你你媳妇手里的钥匙,指向的对象是同一个。啊。这个再理解一下啊,再理解跟数据类型没有关系啊,就方法调用,调用这个方法参数往这儿传,传过去对吧?还有我们刚才这个例子,方法在调的时候,我们这个参数往这传的时候,我们传这个东西到底是什么,如果是基本数据类型是这个变量里面保存这个值传过去,复制一下,复制一份传过去,你包括我们刚才这个也是一样的,它也是把这个变量P里边这个保存的那个内存地址,哎,就是那个值怎么复制一份传给了谁呀?A方法传给A方法。
24:08
啊,你们再考虑考虑,想一想好吧,啊,那这个内容呢,是比较重要的一个内容啊,今天上午内容啊,一定要给它消化了,那么咱们第九章这块还有一个内容就是关于构造方法,构造方法讲完之后呢,今天下午我们有可能会把封装讲完啊,构造方法讲完,封装讲完,然后这个第九章和第十章我们今天应该差不多能结束啊,请大家先去吃饭吧,嗯。
我来说两句