00:00
好,今天的话呢,我们来谈第四道面试题,谈谈这个final的一个作用啊,那么final的话呢,我们分为分别从三个方面来聊聊啊,首先第一个方面的话呢,来聊它修饰类的一个作用,那我们知道呢,Final啊,这个单词本身它是一个最终这么一个单词的意思,对吧?那么最终意味着不可再变了,所以的话呢,当它去修饰这个类的时候,就意味着这个类啊,它不可再被扩展了,所以呢,其实上来说就是它不能再被继承,也是不能再有子类啊,这是一个非常简单的一个道理了啊好,这是第一个,那第二个的话呢,我们来再看一下final啊,来修饰方法的时候呢,那一单意味着什么?因为这个方法呢,不可在变,所谓的不可再变就是它不能被重写。那什么时候我们有这么一个需求呢?好,非常简单啊,在我们的设计模式里面的话呢,有一个模板设计模式啊,这个模板设计模式的话呢,什么意思呢?就是它什么叫模板啊,模板就是一个固定的套路,对吧?OK,所以的话呢,当我们有一些东西的话,需要去固定我们的算法的时候,固定我们工作流程的时候,那这个时候的话呢,我们就可以用这套模式,那么这个时候最核心的点就可以用一个final的方法来固定好我们的算法,我给他举个例子啊,大家看一下,比如说我们现场固定好一个工作的算法,比如说作为一个程序员,那么在这里面的话,他可能又会有个个有一个什么一个工作的方法叫work啊,那作为工作的话呢,他可能在里面需要干一些事啊,所以这个时候的话呢,他可能是这样啊,首先进来之后呢,先开电脑做open啊这么一个流程,然后呢,接下来他在做一些coding,做些代码的编码,然后呢,编完码之后呢,每天下班了之后呢,再把电脑做一个close OK,所以你会认为这是一个什么,这是一个程序员工作的一个固定流程啊,Open口ing close。
01:40
来了,我们知道实际的流程很复杂啊好,那这里面的话我们再说一下,那在这里头他会发现什么呢?就是说这是一个固定的套路啊,不管是哪个程序员都是先开电脑再编码,再关电脑,对吧?当然了,这里面的话,这是固定好什么固就相当于这个方法,就相当于他做了一个设置什么固定了我们的这个工作流程或者某个东西的算法啊,OK,但是其中的话呢,一般来说的话,比如说诶具体的这个口Ding这个方法,我的子类可以去斜线,就是某一个方法的环节可以留下一个口子啊,让我们直类去重复修改,比如说诶Java程序员他们的口里写的是加va代码啊,那C程序员写的是C代码啊,然后C加加C加加代码等等,OK,那你会看到了,这个时候不同的程序员针对这个coding这个动作,他们干的方式可能不太一样。
02:27
对吧?OK,所以既固定好了一个流程,又在某一些地方,某些环节对外开放了一个可以修改的可能,所以一般来说的话,像这些方法可能会变成什么,就是在内部里面的话呢,这个coding这个方法,它可能就是一个抽象的方法,诶留给子类去重写,诶那整个流程的话呢,是这样子的,好,这就是final啊,作为修饰方法的一个应用场景啊好,那咱们紧跟呢,再往下聊下一个东西什么呢?下东西是来说final修饰变量。注意啊,注意注意,这个地方的话呢,通常会会拿来做试题,当然了,这是一些比较基础性的考题,比较基础,那么一般来说的话呢,我们都很清晰,如果它修饰的是一个基本的数据类型,这个值是不能被改变的,对吧?诶,这个大家都没有问题,都会认,都是OK的,骗不了,但是注意这点这点来注意了啊,这个地方的话呢,经常有同学会栽进去。
03:20
这就说明什么?基础不牢,地动山摇是吧?OK,来看一眼啊,如果修饰的是引用类型,那么引用的指向是不能改变的。好,我给他写一个代码,大家看一下这个东西能不能成,注意看啊,假设我现在的话呢,有一个student啊,就是有个student类对象,然后另了一个对象出来。好,然后的话呢,在这里面的话呢,我们写一下假设啊,这里面的话呢,这个地方我们写成啊张三啊张三。好,注意在前面这里头的话呢,给它加一个关键词叫final来做一个修饰,看懂吧,诶好了,那接下来的话呢,我在下面这里面我写个student.set假设我去修改它什么,我修改它的年龄,假设它里面有年龄这个属性啊,那我去修改它年龄的话呢,把它改成18岁,那请问这个时候呢,这道代码,这一行代码它能成功吗?
04:12
他能不能成功?OK,如果能,你说能啊,大家可以可以呢?在此刻打上你的答案,能还是不能啊,OK?好,来揭晓答案啊,这个地方的话呢,其实它是能的,它是OK的啊,为什么呢?你说不是用final修饰的吗?注意他final修饰的是谁,他final修饰的是什么。修饰的是我们这个对象。而对象里面东西的话呢,并不受它的约束,也就是说大家知道什么意思呢,是这个意思啊,是这个相当是什么,相当于我们有两块内存,一块是占,一块是堆。然后呢,在这里面的话呢,相当在站里面有个一个一个引用是吧,诶指向了我们这个堆的一块内空间是吧,一个空间好这指向了它,也就是意味着什么呢?意味着相当是这样啊,相当这个student里面呢,这是个引用类型是吧?它有两块内存,一块站一块堆,然后指向了堆。
05:05
然后堆这里面的话呢,它是OK的啊,那所谓的final老师说你这个地方不能再去开辟一块新的内存空间出来,你不能说再向另外一个地方,什么意思呢?也就说如果此刻你这么来,你说我想这个student啊,再给他留一下啊,再给他重新附个空间,新空间,然后呢,再给他重新重新new一次啊,丢student好,比如说给他改成李四啊或别的,抱歉啊,这个是不行的,因为这块的话,你要干嘛,你要开辟一个新的空间了,所以这就不行,这就是它这个东西发有的作用了,所以此刻呢,就是这样子的话呢,这是不这是不OK的啊,这是不行的。这不行的,OK,但是你要你这个东西呢,你没改纸箱,你只是改里面的值,就像这样写A,你把里面的值改了,比如说他原来年龄的话呢,是这个28啊,为了显得年轻一点的话呢,他改成18对吧?啊,人人都是18岁啊,那好,那这个是OK的啊,这是OK的,他因为他没有改变这个内存的纸箱,它只是把里面的值改了。
06:07
OK好,这个地方的话呢,就是因为经常这个问题很初级啊很初级,但是的话呢,呃,经常有人碰到这种就是犯这种低级的错误,说明呢基础不牢,地动山摇,好那这一块的话呢,今天啊咱们这道题啊就给大家分析到这啊,那如果呢对你有帮助,大家可以呢点个赞啊,咱们呢下节下道题呢继续来。
我来说两句