00:00
下一个叫Java的支传递机制啊,这是咱们说的一个重点,也是一个难点啊,考试刚才也考了啊,嗯,咱们讲课的时候呢,是先呢,呃,提了一下这个方法内的变量的一个赋值啊,方法内的这个变量的赋值呢,咱们前面呢,其实都已经接触过了啊,也都用过了啊,所以这呢算是一个复习。哎,这是一个复习啊,不多说了,就啊,哎,下边这里边儿的这个,嗯,我输出的时候呢,结果是多少,这个所有的人都必须会啊,都必须会啊,那这里边呢,就涉及到了一个具体的规则,就是咱们上边写的,只要大家把握住这两个规则就可以了。那CTRLS一下。好,把握住这个规则呢就可以啊,嗯,具体呢,其实也是咱们刚才考试的,你这样说也是OK的啊,没问题,然后接下来呢,我们关注的就是在方法行参这个位置上的这个变量的赋值情况,呃,首先呢,提到了一个叫行参和实参。
01:11
那这个比较简单哈,方法声明时候呢叫刑残,哎方法掉的时候呢,那叫食残了,哎你给大家附了一个真实的形参的值,就叫食残,哎比较简单啊,那么具体呢,我们在应用的时候这呢,我们是写了两个问题,第一个呢是交,就是整个呢,是针对于相当于是交换两个变量值的这个事儿啊,诶我们的一方面呢,是拿这个基本数据类型这样来体会的,另外一个呢,就是把这个数据呢,诶封装在我们某一个类里了,哎通过这个类的属性的方式呢,去体换,体会它的一个换序,哎通过这个呢,咱们来说明,诶你这个行参是引用数据类型,或者呢是基本数据类型,哎是什么情况啊,这是咱们典型的这两个问题了啊,那么总结一下这个规则。
02:01
总价这个规则呢,就是上面写的这个。哎,放到这儿说,如果参数基本数类型传的是数据值,如果是引数据类型啊,传的这个地址值,哎把这个事呢,咱们称作叫做直传递机制。或者叫直传递也行,什么意思呢,就这呢,也算是一道面试题了啊啊也算是一道面试题了,就是说Java中这个参数传递啊,它是一个什么样的机制呢。啊,这时候你就答这个这个Java中这个参数传递啊,它这个机制呢,叫做值传递,就是你这个变量啊,你存的是什么值,你就传什么值,就是传的呢,或者叫负的,都是你本身存的这个值,你是一个本身的数据值,就传数据,你本身存的是个地址值,就传递值,这就叫做值传递啊,直传递啊,有的呢,比如说还提还多余说句说不是呢,所谓的叫引用传递啊,因为引用传递只是说的是引用类型啊,那基本数据类型呢,它也没有所谓的引用了,它存的就是数据了,所以呢,我们应该说叫值传递机制啊。
03:15
行,那么这个呢,咱们针对是方法的行参,上边这个呢,针对于是呃,这个一般的一个局部变量,其实这两个呢,说的是同一种情况,就是结论呢,都是一样的啊,结论都是一样,其实就跟我们上边这个事是推广一下呢,就是这种啊啊如果变量这个变量呢,你可能是一个普通的方法内的局部变量,也可能是一个行参不重要啊,他们的规则呢,是完全相同的。嗯,就核心的就是它基本数据类型,嗯,这个传递数据值,嗯,引用数据类型,哎,传递地址值。哎,记住它就可以了。
04:01
哎,这个是需要大家关注的点啊,嗯,额外说一句,大家不要记另外一个事儿哈。什么叫另外一个事呢?大家呢,有的同学可能会发现哈,就是咱们呢,如果操作的是基本数据类型变量,以这个交换顺序为例哈,哎,本身这有俩变量,然后呢,我们把这个行参呢,设置成基本数据类型的里边呢,试图去交换,发现没换了。当你呢,传递的是一个引用数据类型的时候,你发现呢,就换取了,你不要记这个结论,什么结论呢,说这个啊基本数据类型啊,这个操作的话白操作,说引用数据类型的话呢,操作了就就顶事,就是能换续或者能能怎么着。不要记这个结论啊。那同学就懵了是吧,这有什么区别,嗯,有一个区别啊,这个区别呢,其实现在呢还不太想说,因为呢,咱们还没有系统的给大家去讲关于string啊,虽然呢天天你用string,但是我们目前呢,关于string的用的其实相对还是薄一些的啊。
05:09
说一下这问题,我这还是写成叫Y6。好,我呢定一个string,我叫S1,哎,我呢就叫hello吧,对吧?啊大家看啊,然后我现在定一个方法叫word,我写成个叫做change,这呢我写一个死针形的变量,我叫S,在这个S里边我改成一个氦。嗯,不行,我还没洗完呢就不行了,嗯,然后呢,我在这个位置呢,想去调这个change是吧?哎,我呢得去造这个对象了嘛,然后我通过这个test呢去调这个叫change啊,我把这个SE呢放进去。
06:08
好问此时让我输出的话。我输出输出谁呢?那肯定是输出S1了,嗯,你不可能输出S了,人家S在这里边才有效哈,那那问这个时候呢,这个结果是多少,是hello还是嗨,对这个时候呢,就体现了我们说的这个结论了哈,大家呢,记谁呢?记这个事儿啊,这是咱们说的自始终都是对的事儿啊,你不要记刚才我说的那个错误的结论,什么结论呢?说诶基本数据类型呢,呃,就是你要是传的是基本数据类型,里边不管你咋操作,白操作啊,说要是引用数据类型呢,一进去里边要是改了,那出来以后呢,也是改了的,不要记这个事儿。那如果你要记得是这个事,你会认为它的结果呢?是不是嗨啊?
07:03
啊,有的同学自认为这个老师你这复习没有意义,我这都已经很熟了,嗯,这时候你熟是相对的,嗯,还没见过更多东西,一见更多东西你发现就晕了是吧?哎,这个复习的目的呢,就是有一些上课刚讲的时候,第一遍有些东西呢,不敢给你提,都提完以后呢,懵了,哎等复习的时候呢,基本上你也清楚以后,这时候拿个棍给你搅浑是吧,这时候你再沉淀沉淀,这时候呢,你是真的就清楚了啊你看如果你要记得是这个错误的结论,你会认为它是氦,为啥呢?你看这个引用数据类型,我引用数据类型呢,我给放进去了,你里边呢,是不是对这个引用数据类型的这个对应的数据给改了呀,那按说呢,是不是出来以后也应该是改以后的。按说是吧,就有点像说我这呢,是咱们那个定义的那个data塔,我把这个data呢传进去了一里边呢,把data里边两个变量不是换续了吗?说出来以后呢,诶确实也换了,你会认为说啊传的幺零类型变量出来以后呢,也是改以后呢,这个结论是不对的啊,你要是按照那个结论记的话呢,你会认为这个结果就应该是害,但事实上呢。
08:08
事实上还是hello啊,这时候这个整个这个这个学习的这个体系就崩了是吧?哎呀,怎么是hello啊,嗯,这个记这个结论是没有问题的,这是一个正确的结论啊,那我们按照这个结论来分析一下,只不过呢,这里边涉及到一些新的知识了啊,嗯,这是咱们的站,嗯,换一个颜色。这是咱们的站,这是咱们的堆,这个问题要想说清楚呢,还依赖于这个方法区的常量池,对,把这个知识点呢,咱们提前呢就给大家再提一下了啊呃,因为正好涉及到这个直传递这块了,只有死string比较特别啊,只有它比较特别,我们在这个站当中呢,这不叫SSE,然后呢,这个叫hello,这个hello,哎,我们S1呢,既然是个引用数据类型,它存的呢也一定是个地值值啊,这个结论也是对的啊,只不过这个hello。
09:04
它比较特别啊,这个咱们班还没有同学问我啊,其实按说呢,应该有人来问我了,为什么呢?说这个string,这不是一个类吗?类咱们目前造对象不都应该是new吗?怎么这个string还可以直接这个样子的呢?你不会感觉这个很奇怪吗?是吧,首先说string确实可以拗拗的方式去造,确实可以,只不过呢,对它呢,比较特别哈,它除了可以拗之外呢,它还可以这样写,只对它是这样子的,别的类都不行哈,只有它才能这样,其实也正因为它这个可以这样写,所以大家有的同学潜意识总把它误认为是一个基本数据类型,因为只有基本数据类型,咱们呢,比如D后边直接就给值了,没有去new。所以你会认为它这个形式上呢,有点像基本数据类型,但是它是个引用数据类型啊,那么它这种格式写法呢,在内存存储上呢,也比较特别,就是我们这个哈呢叫存在叫字符串常量池当中,哎这儿呢就有一个字串叫做哈啊,那么这个哈呢,也有个地址值,也是你的首地质值。
10:16
啊,实际上这个hello在底层怎么存的,这呢就得回归到数据结构的层面了,那hello呢,你想想它是一个好几个char类型的,它底层这个hello呢,就是用一个char型数组存的。啊,这个数组的长度呢,就是你这个字符的个数,这不五个吗?长度就是五,就这个意思啊,那它也一定会有个首地值,把这个手地指值呢,给了咱们的S1,这样的话呢,我们这个S1呢,就指过来了。这就是他的这个情况啊,然后呢,咱们把这个S1呢付给了你这个行参叫SS呢也是行参了,自然自然而然呢,它也是一个局部变量啊,这个我把它的地址给了它了,那就意味着我们这个S呢指向的也是它,哎,这是没毛病的啊,咱们传递的仍然是地址值,但是接下来这个事儿呢,就没见过了,我们把S呢改成氦。
11:10
这个改的话呢,并不是在这儿改的,这里就涉及到对一个词钝的一个特特征哈,就是它呢叫字串常量池,它是不可变的自动序列,后边咱们再说啊,就是你要想对这个字符串修改,咱们说了你这是一个差行数组,这个数组呢,是不可以来回给它改的长度啊,是不能改,所以呢,S呢,你既然变了,那就那呢就是你自己新去造一个,哎,这个差形数组啊,叫做氦,改完以后的话呢,把你新改好的这个地址值赋给你这个S,哎,所以这个地址值就变了啊,那我们这个S呢,就指向这个氦了,当你出了这个方法以后呢,我们这个S1呢仍然是哈。这就涉及到这样的一个新的知识点,这个没讲过的啊,通过这个知识点呢,我们想说明的问题就是大家仍然记咱们刚才给的那个结论,就是传什么,你存什么就传什么,存的是地址值,传的还是地址值啊记这个结论啊,记这个。
12:06
行过了下边呢,涉及到这个内存解析的情况,这就是咱们这个课后就咱们就讲的这个例题哈,其实。哎,当你是基本数据类型的时候,我把这个就解解一下就啊。哎,传递的就是你这个保存的这个数据值。哎,当是应税类型,哎传的就是地址值。CTRLV1下行,不多说了啊,包括呢,咱们早上考的第五题,这两个题之外呢,又考了一道题啊,大家可以下来再看看。行下一个递归方法啊,这个呢,大家作为一个了解啊。啊,这个说了,这是作为一个了解出现的,首先什么叫递归。就是自己调自己是吧,对于方法来讲的啊,说一个方法内呢,如果自己调自己呢,那就要递归方法。
13:05
嗯,那如何理解递归方法,这呢,我们写了两个点。说方法递归呢,包含了一种隐视的循环,自己调自己,自己又掉自己,这就构成了一种循环了啊,这种叫隐示的循环,不是显示的写了个for或者while,它呢会重复的执行某段代码,但是这种重复执行呢,无需用循环控制啊,这是它的一个理解。第二个呢,这个递归呢,你一定得有一个终止,就像循环一样啊,尿不终止呢,那就是死循环了,那这个终止呢,就是我们这里所提到的啊,它得向着一个已知的方向去递归,哎,咱们写的这个例子呢,大家也能看得到。我们想算N,那我就需要依赖N减一,嗯,N减一呢,又做一个N,就需要再接着变小,那么已知的方向就是你一定会有一个哎,往小的方向走的时候,到某个数那块呢,就不用再去往下递归了,就会有一个到已知的一个情况啊,那例二例三这种我们都我们都举例子了啊,整个关于地柜这块举例呢,这我写了一共有这几个,六个是吧。
14:12
呃,六个哈,呃,大家呢,体会一下就可以了啊,CTRLC拿到这啊。嗯。就是有一些问题呢,大家后面呢,遇到的时候呢,呃,用循环是一种解决方案。啊,但有可能用雄环写起来还挺复杂的,那用递归呢,有的时候反而会更简单,嗯,像这个汉诺塔这样问题用递归写,其实写出来以后呢,比较简单啊,有兴趣呢,大家下来可以去搜一下啊,那么在这个面试当中呢,有的时候呢,也会涉及到一下啊,在这儿呢,我放了一道题,呃,这个呢,就是之前嗯,咱们的一个毕业的学生去百度面试了,然后涉及到一个叫双重递归,其实这个起了个叫双重递归哈,只不过呢,就是我们在这个位置,这个可能稍微有点小啊。
15:08
变成个红的啊,就这呢是调了一下这个方法啊,这个大家没见过这个单元测试了,后边我们讲啊,调了这个方法,这个方法的话呢,是不是就蹦到这儿了,在这个方法调用过程当中,它涉及到呢,自己调自己了,这其实就递归了啊,只不过呢,在这里边它依赖于就是调它的前一项和它的再前一项。啊,就这个一个问题,说这里边问你这个,其实从这个形式上来看呢,有点像这个费拿数列了。啊,像等于它的前一项再加前一项,但是这个题人家也没让你去算这个结果是多少,而是问的叫执行了多少次算是啊,但是这个其实严格上来讲不能叫斐布纳杰数列,斐布纳数列呢,要求它的第一项和第二项都是一,然后第三项呢,是前两项的和这种啊它这个第一项K等于零的时候呢,它是零是吧,所以它那不能叫斐纳去数列了啊这个其实你要说这个返回的这个值是多少呢?你像第一项是零。
16:05
嗯,K等于零的时候是零,K等于一的时候呢,一又等于这个零加上这个负一的时候,负一的时候也是零,其实这个这个这个反回来结果它全是零,当然呢,这个人家也没问这个结果是多少啊,他问的是这个count是吧,现在这个count这个情况啊,呃,是多少,然后包括这个K是多少,呃,这个自己呢,画的时候就有点懵了,其实呢,大家可以去画一个这样的图,看着复杂,嗯很好理解,你看啊,我这个数传的这是传那个十啊,这个数比较大了,我传的假设是个四,你看这个四的话呢,它就需要是算出这个三加二呗,那三呢,又是不是得算成二加一啊啊二呢又分成一加零,然后一呢又得分成零和负一,到这块呢,这算终止啊,就是K呢,是不是从它小于等于零的时候,这不是都是一个确定的一个零值嘛,是吧,每一个呢,都这样给它拆开。
17:00
拆开以后呢,它的一个便利过程呢,是这样的,这个呃,你想算这个24,它需要是三加二,这个三呢又得需要往下算,所以这块先停着,先不要着急去算这块,所以这个呢,完了以后执行它这个我再换一个颜色啊绿的是执行它,它呢又得拆成俩,这个先放着,先呢它去执行它,这个呢又得往下放,先去执行它,然后再往下他去行它这个执行完以后呢,再执行这个,然后呢再回来,相当于你这个执行完了,然后再执行这个,然后相当于它执行完了再执行这个,这个呢又又往下又得分成俩,再执行它,再执行它,然后再整个这这一片完了,然后再跑到这块执行这个。这个呢又得拆再执行它,执行它这个执行完了再执行这个对诶同学就发现了,这呢,如果还记得这个,你们学过那个数据结构的话,大学啊,这就相当于这个二叉树,这是个二叉树,这个二叉树呢,相当于我在用前序遍历,前序呢就是先是中间这个节点,然后在左边,左边完了以后呢,右边对,所以说我们就是先塌再塌再塌再塌再塌,然后呢,这个这个这个这个这个然后回到这这个这个这个这个这个诶这样就我这写了一个C的这个顺序,这就相当于是一个前序遍历啊,所以有的时候他考察这个知识的话呢,有的内容呢,这个你会连成一片的时候呢,发现它就没有那么难了啊像这呢,只是一个个案啊,一个题而已啊,大家不用把它想的太严肃了,呃,这个递归这块呢,咱们目前的话呢,还都当成是一个了解性的东西啊,不是用非常严肃的,像我们讲这个。
18:40
直弹力一样啊,这个肯定是需要大家必须要清楚的好。
我来说两句