00:00
好,那么关于代码块呢,我们就告一段落了啊,然后下边的话呢,我们这块呢,说一个关键字,这个关键字呢,叫做final。哎,这个关键字呢,其实不太难啊,挺好理解的啊,来我们看看它的一个使用,首先呢,关于这个final呢,有个理解啊,就是把它翻译成呢,叫做诶最终的。嗯,这个词呢,大家应该在很多场景下呢,也见过啊。啊,你比如说呢,打这个比赛啊,像现在这个世界杯比赛是吧。对,到最终的这个决赛了啊,这不一般都称为叫final吗?包括呢,大家小时候比如说玩过那个拳皇呀啥的是吧,三局两胜是吧,第一把你赢了,第二把人家赢了,第三把的时候呢,这块啊印象很深,大大的一个final是吧。最终的了啊,最后一把了。是吧,就这个意思啊好,那现在的话呢,你看我们有这样的一个,呃,关键字,它可以呢,去修饰一些结构啊,可以修饰什么呢,我们说可以修饰类。啊,可以修饰方法,可以来修饰变量。
01:00
注意这个位置我写的是变量,没有说是长圆变量。啊,局部变量呢,也可以的啊好,那么你想我们要用这个final去修饰这个类,这个类是一个最终的什么意思。那这个类呢,就就到这儿了,不能再往下延续了是吧。啊,那就是表示此类呢。哎,不能被继承。啊,你如果说呢,把这个继承呢,看成是你的一个延续啊,这是叫父,这叫子可以生孩子是吧,那加了个final呢。绝后了是吧?哎,中国呢,中国历史上呢,有一类人。是吧?诶对,就没有后代是吧。对啊,哎,这个呢,就是相当于比如说用final来修饰了是吧。来举个例子啊。这个我们就final。他的一个测试了啊。好,这个呢,其实咱们就直接来写就行啊,嗯,我就写一个哎class了,这个咱们就嗯随便来一个吧,比如我就还叫这个order了。
02:07
哎,这个叫什么名其实都行啊,诶,这个我就先别叫order了,直接叫一个A吧。这个类的话呢,我把它写出来了,写出来以后呢,正常来讲,我们可以呢,用这个B呢,去继乘以这个A。你看这都没毛病啊,但是呢,一旦你这个A内呢,这块加了一个final是吧。哎,这种就报错了。啊,它提示呢,说你不能够去继承于这个叫继承的意思啊,不能继承于我们这个生命的这A了。啊,因为呢,它是一个不能有此类的这样一个类。OK啊行,这块呢,就是我们说的这样的场景,那么大家可能会想,诶,什么样的类这块我们需要用final去修饰呢,那就意味着这个功能啊,你就不要再去扩展了啊,比如说。对,咱们用到的这个字符串叫做string,后边呢,跟它相关的呢,还有两个啊,String buffer。对,Build。诶,这样的三个类啊,这三个类后边这俩呢,其实都是跟字符串相关的啊,所以大家理解后边俩呢,暂且你就用正去理解就行。
03:06
这个string的话呢,它就加了一个final啊,你看我CTRLN一下,咱们看一下这个string啊。哎,String找一下这个位置,哎,找哪个版本都行啊好,你进来以后你发现了他加了个final吗。那就意味着我们不能够去声明一个类呢,让他去继承一顿。啊,那回过来啊,当你试着这样做的时候。啊,声明一个,Class,你说我叫萨斯顿。啊,去extend一下这个。哎,这么着啊,那不好意思,这块呢也不行。说不能够去继承于final的这样一个类。就不可以了啊,那大家想一下为什么这个呢,去加了final了。嗯,对,其实呢,就是这个string呢,它表示的就叫字符串了,说你要用呢,你就直接用我这个类就行,然后里边这个方法呢,我已经设计了很多了。我要没有设计的呢。
04:01
那就没有了。是吧,诶我可能后边呢,GDK版本会更新,更新的话呢,如果有一些常用的,那我可能就加进去了,诶对于普通用户来讲呢,你就拿着我这个类就用就完了啊,没有可扩展的余地。啊,那就是我们这样意思啊,当然了,在实际开发当中,如果你要针对论呢,有很多具体的需求呢,你可以自己去造一个的一个工具类是吧。是那样的方式呢,你去操作也行,工具类里边你造的一些方法,就使用这些基本的方法就可以了。人家的基本方案就这些啊。这个呢,就表示呢,它是一个翻着的,没有必要呢,对它再进行所谓的功能的扩展了。啊,这呢,就是这个意思,好这就过了啊,然后第二个我们用这个final来修饰一个方法。说这个方法呢,就是最终的了,最后的了什么意思啊。对这个方法的一个延续呢,我们理解成功能的一个扩展,不能扩展了就意味着不能重写了,是吧。所以呢,表示。此方法。
05:01
哎,不能被对重写。来举例子啊,回过来。这块的话呢,比如我们去声明一个这个叫C啊,这个C里边呢,我们就定义一个普通的方法。哎,我就叫一个method吧。啊,具体这个方法体我就不写了啊,然后接下来我再声明一个D,让D呢去继承于这个C。然后呢,我们在啊这个力里边呢,把这个方法呢,做了一个重写。呃,具体个方法体呢,我就不去写了啊好,那么这呢是可以的,但是一旦我们这个方法呢,加了一个final。哎,加完以后这个位置就报错了。哎,这块提示信息。说你这个method方法呢,你不能够去重写啊,我们这个C里边的method啊,因为呢,它是有一个final啊。哎,说的呢,比较清楚。那也就意味着这个方法呢,我这个功能已经设计的挺完备了啊,你也没有扩展的必要性,你要用呢你就用。不用就拉倒是吧,哎,那有哪些方法是这样的呢。
06:00
诶,这个我们说,诶,比如说咱们这个这个类中的。啊,它有一个方法呢,叫做get class。哎,这个方法呢,它就是啊,来看一眼啊,CTRLN。哎,这个object。哎,这个我们来看一下这个all places啊,诶,比如我们打开一个,然后controlr f12这个我们开始叫get class,哎,就它。好,那么这个方法的话呢,我们发现呢,它加了一个final,那表示这个方法就不能够被继承,哎,被重写了。这话的做呢,就是获取你当前这个对象所属的类。你累,是谁就是谁。你说你重写。你还能写出什么花样来吗?是吧,也写不出什么花样来了,所以说这块我就final了啊。好,那顺便呢,我们看这个方法的时候呢,这边有一个修饰叫native是吧。这个而且呢,你看它还没有所谓的方法体啊,哎,那么这个native呢,表示的就是我们调用的叫本地的方法了,实际上就涉及到我们会调用呢,呃,底层的这个C或者C加加相关的代码。
07:03
啊,那么这样的方式呢,就是叫native就本地方法,那么这个方法呢,如果调用的时候,我们说了每一个方法对应的一个战争嘛,战争放在战里边,那么这时候呢,他入的这个站呢,就是我们讲内存的时候呢,叫本地方法站。还有印象吗?不是本地方法站。啊,就是入的这个啊,这个本地啊方法指的就是这个native的方法。啊,然后这种方法为什么没有方法体呢?因为呢,它调的是底层的C或C加加了,它不是用Java代码写的,所以这块就没有这个大括号的这个方法体了。他一定会链接到相关的这个,我们其实在JDK里边有很多的这个DLL文件哈,就链接了相关的这些文件库里边的C的这个代码。知道一下这个事儿就行了啊,这就是他这个关键字了啊,那么我们现如今再去啊JDK更新的时候呢,基本上你发现呢,它不会再去增加一些native的方法了,这些方法呢,它出现的通常都比较早。
08:00
因为呢,1995年的时候,Java呢还非常的。趋弱是吧,啊非常的幼小一个小苗一样是吧,这时候在C和C加加的话呢,是不是就非常的强大是吧?那么C呢,要想崛起,而且呢,本身咱们也说了,刚开始的时候它执行效率也不高嘛,加上C呢,相关的一些库呢,也很丰富,所以呢,Java这块呢,说那我就想用用你的一些东西是吧。所以呢,他就会用一些native的方法了,一方面呢效率高,另外一方面呢,不用自己写,那现在的话呢,这个小苗已经长成这个参天大树了,是吧。再去呃,写代码的时候,他也有这个叫即时编译器了,运营效率呢,也不比C跟C加加低了,所以呢,他就基本上都自己写了。啊,这只有呢,在比较早的时候呢,我们才会这样的来用啊OK。好,那这块我们就拉回来了啊,这个呢,你知道为什么方法不用被重写啊,因为呢,已经把功能呢确定下来了。好,那么主要的我们来看一看这个用final来修饰变量的问题啊。
09:01
那我这块呢,叫修饰变量,我可没说修饰的叫成员变量,那IG呢,它既可以修饰成员变量。也可以修饰局部变量啊。啊,也。可以。哎,修饰啊局部变量。那么这个变量啊,咱们说呢,用final去修饰的表示呢,叫最终的了,你说这是什么意思。对,这个变量呢,负了一个值,这个值是最终的了,原位值呢,你就不要改了。啊,那么就意味着此时的这个变量呢,其实就变成了敞量是吧。哎,这我们说一下啊,说此时的这个我们加个引号了啊。啊,此时的变量啊,其实。啊,就变成了。常量。哎,常量那就意味着啊。一旦赋值。
10:01
哎,就不可更改是吧。这个呢,就是我们说的这个所谓的常量的它的一个特点啊,这就说清楚了啊,那么下边的话呢,我们就要分别来说一下,用final修饰成员变量,修饰局部变量啊,这个所谓的不能更改它的这样的一个情况了啊,这个呢,我们呃说一下这个第一种情况啊。Final。哎,他呢,来去修饰叫成员变量啊。诶,那么这时候大家你要看啊,这个变量的话呢,我们说原来啊,你赋个值不满意,再附一个包括呢,我们在上面也讲到了,说你赋值的可以有这样的一些位置啊,现在的话呢,我们说一旦复制以后就不能改了,所以就会使得这个赋值操作呢,非常的珍贵是吧。就一次哈。啊,就跟说人的生命呢,就这一次。你得好好珍惜是吧?啊,有好多那些这个这个这个像以前我们说这个做开发的都996是吧。有些呢,确实30多岁的,在一线大厂的。
11:00
这个好多呢,晚上就起不来了,就是吧。嗯。你包括咱们其实也有一些讲师也是一样啊,就是嗯,去大厂的话呢,嗯,当然了,薪资待遇高一点啊,福利待遇好一点,工作环境好一点,或者你可以跟一帮志同道合的人在一起工作,感觉也挺好,是吧?啊,甚至你做的一些项目,像前些年来看哈,都是一些行业的,或者整个咱们国家的一些非常前沿的一些项目,感觉也非常的有意思,这都没毛病啊,当然呢,确实会比较辛苦啊。比如说你赶上一个项目,这个着急要上线,大家呢,可能就通宵加班整上这个一周两周这样的时间,还有呢,像这个不一定是大厂了啊,也有一些这个公司里边它叫封闭开发。啊,封闭开发的就是你整个这个你们开发的一组,比如说十几个人,然后呢,这个公司呢,就给你们租一个,比如说北京啊,或者上海的租一个比较偏的地儿,这一栋别墅啊,大家封闭一个月两个月啊,然后集中式的大家一起开发,然后把这个项目呢,最后交上来。就封闭开发这个,相应的这个工作强度就会大一些了,是吧。
12:03
这个当然这个看个人啊,你像咱们有一些讲师的话呢,呃,你要去大厂,其实也可以做得很好,技术水平呢也很高,但是就是因为呢,工作强度太大了。诶我想强调点呢,不是说咱们讲师就怎么怎么样是吧,我想强调的点是啥呢?就是说呃,真正你呃在职业生涯当中哈,呃你去大厂也好,怎么样也好,其实很多时候呢,到后期不是说呢,你技术不行。技术这个东西啊,其实大家现在觉得挺难的是吧,只要你这块你坚持着去整,而且入了门以后呢,后续呢,其实学起来都挺快的。只要你愿意学,都能学的会。但是呢,你呃,是不是说一定薪资能拿到这个五六十万,甚至说更高,其实有的时候呢,还真的是在大厂里边,就是靠你拼出来的啊。你看那些,呃,所谓的P7也好,P7以上的P8也好,P9也好,这些人呢,体力都相当好。对,真的是这样啊,就是到后期呢,其实你说技术怎么样,这只是大家现在觉得是很重要,到以后呢,就是看你体力行不行。
13:04
啊,你技术再好,你体力不行,你也上不去,大家需要呢,集中式的开发一两个月你扛不住,你说我怕挂了是吧。那那你就下来,那能上的上。啊,所以说这个有时候会觉得天生基因好的这个人还是挺好的是吧,体力很重要啊对。哎,包括呢,你相应的一些这个人际关系啊,处理这种这个这个这种问题啊,团队协作呀,是吧,管理能力啊,其实在后期发展当中,你发现呢,制约你的通常可能都不是技术啊,可能是其他的一些要素。但是你说我别的我都不行是吧,那好了,那你就专攻技术也行。就是你有个自己的长板啊,尤其呢,我觉得咱们比如作为这种普通的咱叫打工人是吧,来讲的话呢,其实大家一定要有一个长板。啊,就是你在某一方面呢,一定要突出,这样的话呢,会使得你有竞争力。啊就可以了,对于这种比如说所谓的这种这个,呃,某某大公司这种老板呀,或者级别很高的这种高管呀,对于他们来讲呢,其实是会关注于短板。
14:08
不要呢,某个板太短。诶这个呢,短板的话可能会他这个后期的话会有一些弊端会凸显出来,但是对于普通人来讲呢,就是要有长板。好,这个咱们再拉回来哈,现在我们用这个final呢,去修饰一个成员面料是吧?啊那么这时候呢,就显得很珍惜,因为你只能是调用一次哈,那调用一次的话呢,我们就要考虑在哪些位置呢,可以去做这个赋值的操作了。哎,这个呢,是我们现在想关心的一个问题,好回过来啊。好在这里边儿呢,我们下边就来讲这个问题了。这个问题呢,那我们按照顺序就写到下边吧。Class啊,这个我们来一个。小易吧。那么在这类里边呢,我们首先呢去声明啊,这个呢叫成因面料用三种来修饰啊。好,这个成员面料的话呢,权限我就不加了啊,咱们比如说我就定义这个int类型的啊,比如说定义什么呢?咱们叫一个mean。
15:04
Scar吧。你看我这样一写的话呢,咱们说了,我想把它定义成这个常量了,前面我们讲过常量呢,是不是尽量都是大写了。而且呢,是这样子写的,中间有个下划线啊。好,然后呢,这个值的话呢,我想给大家附一下,嗯,这个呢,比如我显示的就附了个值,写个哎,最低分是零吧是吧?好,然后这个位置呢,我想给大家加上一个final哈。哎,那我就加了。哎,表示呢,这个变量了,现在不是变量了,就是一个常量了。常量就意味着我们不能再对它的值进行修改了。啊,那么意味着这个为了方便啊,我放到这块吧。诶,然后这块大家你看啊,我这写一个酶方法。然后呢,这个呢,我们想去调一下它,那因为没有死在这个修饰,所以你得创建对象哈。诶,这那就可以了,好,此时的话呢,我去调这个means scar,这是没有问题的。但是你不能对他的值进行修改了。
16:02
你说我想改成一,那不行,因为呢,它是final的。啊,这是final的一个变量是吧,所以这是不行的,大家应该能理解啊,好,那么现在的问题就是说我们针对这个赋值操作假设呢,你看我要把这个显示赋值给删了啊,看看行不行。哎,你发现的不行。哎,那说诶这不是有默认值吗。哎,注意一下,对于我们这个final修饰的这个成员变量呢,这时候默认值呢就不好使了。换句话说呢,就是即使你想用这个默认值零,你也要写出来。好,那这呢,我们的问题就来了啊,说有哪些位置可以给创业变站长去复职啊。这呢,就是我们要关注的问题啊,有。哪些位置可以给?哎,成员变量。来复制好在这个位置的话呢,咱们前面也都讲过了啊,哎,不就是默认初始化,哎,显示初始化构造器代码块,包括呢,后边再调方法。是吧,哎,那这块我们说呢,靠谱的地儿呢,只有这几个,一个呢叫做显示。
17:04
哎,我就叫赋值了啊,或者呢,叫代码块中赋值。哎,或者呢,是。够大。器中。复制没了,哎,就这三个位置。其他的呢,都不靠谱啊,我们也可以顺便说一下啊,首先刚才呢,我们提到了一个默认复制呢,这个事儿不靠谱。不行是吧,啊这个呢,我们就是显示符的值。好,那除了他之外呢,我们比如说再去声明啊。不妨呢,这块都叫int类型了,哎,我们这个最高分。比如考试的话呢,最低分是零分,最高分呢是100分,这个100分呢,我就不想显示的付了,那我就考虑使用这个代码块去付。哎,我就呢,把它呢复制为100。哎,那这个位置呢,我就不用写了。哎,这呢也是可以的。啊,但是同样问题啊,一旦付完以后呢,你就不能再付了,比如说我这块我CTRLC一下,我再来一个,真的我改成一百一就不行哈。哎,他俩先后执行呢,这就相当于再复制了,所以这个呢是错误的啊。
18:02
包括这个Miss高也是一样,我这已经写了零了,诶是不是就意味着你不能在这块呢,再整一个一是不是也不对啊。哎,对,这个呢,也要注意一下啊。好,这个呢,我们用的叫代码块中赋式啊赋值啊,再来一个啊。比如说我们再来一个final的啊,Int类型。嗯,我再换一组啊,比如说我叫left。啊,这个值,这个值的话呢,我先这样。啊,就比如大家这个玩游戏的时候啊,我们去操控呢,就是上下左右这个呢,你在相应的这种方法里边呢,你可能会呃,反复的去用这个上下左右这个操作了,呃,那这时候我们不妨呢,就给大家声明成相应的一个常量啊,然后呢,在这里边你就用这个left right去表示。更形象一些,所以这个life的话呢,我们想复合值。哎,怎么付呢,你可以考虑呢,在构造期当中付。哎,这呢,我就写个构造器,哎,目前呢,他还报错是因为呢没有负过值啊,我这个left呢,我就负过值,比如说呢,这个值二。
19:02
嗯,也可以。哎,那这块的话呢,我们一旦造完对象呢,这个值呢,它就是二了啊,就是最终的了,哎,那如果说我要是写多个构造器的话。哎,这么着哈,这个构造现在假设啊,我就写个in型的一个left。那这时候呢,你看我写完之后呢,首先他又报错了是为啥。呃,因为呢,我要是用这个构造器去找对象的话呢,是不是它就没有复合值了。对,你得确保了一定得有值哈,哎,那这块呢,我们就可以呢,比如说left,这呢,我就用这个left去付。诶,你看这样是可以的啊。诶说这块,这这这算是常量吗。这怎么感觉像变量呢?对,注意对,你只要造这个对象的时候,你指定这个值是几,它就付给几了,你要再去改个指针式,你又造了个新的对象。那新的对象这块不是每个对象一份吗?所以不影响是吧,该变量该常量还是常量啊EEE又一个E,这我写个十。
20:07
哎,这不就把这个十作为这个left啊,付给我们这个left了,它就是十,而且付完以后不能改。啊,你通过这个E1.left,你可以看它的值,你说改成11,那不好意思不行。哎,常量啊好,那么关于我们说的这个常量的属性来讲呢,就只有三个位置啊,显示赋值代码块中赋值,构造器中赋值,注意方法,赋值不靠谱。啊,这个呢,能想象出来不?啊,那个叫是吧。这个位置目前报错,这是正常的啊,你说我们这块呢,我们啊定一个方法。Avoid,比如我们就叫一个set,一个right吧。在这个位置就in一个right。哎,说呢这个。哎,它呢,就复制为我们这个叫。诶,我用方法付的,诶这怎么不行呢。
21:03
你看该报错还报错是吧?这个怎么解释一下好说呢。方法需要用对象去调是吧。而调对象的时候呢?其实这个值该有就应该得有了。啊。什么意思,这个意思你看啊,咱们讲这个属性赋值的时候呢,你看我这有条线哈,这个上面呢,实际上都是在造对象的过程当中做的事儿,这个的话呢,是不是对象已经有了是吧。哎,人家这块呢,就要给这个常量去赋值,它就意思是什么呢?当你创建完这个对象的时候呢,这些属性的这个值就已经得有了。你后续呢,这赛的方法呢,体现为呢,是在修改这个值。但是你现在你提前又没告诉我这个值是多少,那你所以说呢。他就报错,而这个呢,也明确说了,你不能在呃,有了对象以后呢,这个方法里边再去改这个值,他这块呢,想体现是不能改值。啊,因为是常量这块呢,报错呢,是体现为你没有在呃,我们给的这三种位置呢,你去给我复制。
22:06
因为呢,构造器这块执行完以后,对象就已经创建好了,对象创建好了,这个属性的值就应该确定下来了。啊,就是这个意思啊,所以说除了这仨位置,其他位置不靠谱。我把这个我就注释了啊。哎,就这么着。好,那么关于呢,他去调这个呃成变量的问题呢,大家只需要关注这个事儿就行。好这个呢,就说完了啊,好这个说完以后呢,我们再稍微的说一下这个。哎,3.3.2啊,用反钟来修饰,这个叫局部变量啊。好,那么修饰这个局部变量的话呢,那毫无疑问,就我们上面提到的,一旦赋值啊,这个值呢,就不能修改啊。哎,就不能修改好,那么这个具体来讲的话呢,这个我们可以又分为呢,就是方法内声明的局部变量是吧。啊以及呢,是方法的行参哈。
23:00
诶这块的话呢,就涉及到了说你看这个成现变量这块呢,还得必须得附上值,那么像我们要方法内生明这个局部变量,是不是也意味着你在调用之前得附一次值。而且在复完职以后呢,就不能再改啊。这个呢就说哎,在调用局部变量前啊,一定需要赋值。而且呢?一旦赋值。就不可更改。啊,这个呢,相对来说比较好理解啊,好,那么这块我们回过来可以呢,再举一个这个例子啊。嗯,这关不发,我就写到。这个位置吧,假设啊,这叫class的一个F啊。好,这里边呢,我写个方法啊,假设呢,就做method的这个方法了,这个方案里边我们定一个,比如说这个叫number了啊,这个值是十,像原来的话呢,我们这个number呢,加加一下这都没问题啊。然后这块你再打印一下这个number,这个纸这都可以,哎,但是现在的话呢,一旦我们加上这个final了。啊,这个呢,首先就不能做了。
24:01
哎,就不能去更改了啊,然后这块你附上这个值就行,所以说这个值呢,你是写到一行上去了,你还是说这块呢,这个number呢,呃,这样写的这都没问题,只要你在调之前呢,你附上值就行。而且一旦复制不能改。啊,这就这个事儿啊,好,这个呢就比较好理解啊,接着的话呢,我们再看一下这个带参数的啊。这个参数,比如我这有一个number了。然后在这里边的话呢,你可以直接就打印我这个number这个值,哎,这都是可以的啊,这个值的话呢,是一个变量啊。就是在你调这个方法的时候,你附上这个值就行,里边的话呢,也可以呢,针对这个值呢,加加是吧。这都没问题啊,但是一旦呢,我们这加了个final了。哎,表示呢,它就是一个常量。这个常量呢,还是在你调的时候负的啊。然后呢,你敷完以后的话,这个里边就不要改了。哎,就这个意思啊,好,回过来说方法的行参啊,怎么着呢,这个呢,首先你用这个final去修饰了啊,我们说呢,在调用此方法时,然后给行参呢进行复制。
25:05
啊,那么接着也是一样啊,一旦进行赋值就不可更改。啊,这个就没啥问题。行,其实也比较好理解啊,主要呢,大家记住一个结论就行啊。好,那么这块呢,我们就把这个final修饰变量的事儿呢,就说完了,这块呢,稍微的麻烦一点啊。好,这这块说完以后呢,最后我们再稍微提一下,我们在平时开发当中呢,经常会看到final和这个static呢,去做一个搭配。啊,尤其呢,是针对我们这个final和study这个搭配呢,来修饰一个变量时。啊,内向这个变量呢,肯定不能是局部变量了啊。因为final呢,呃,Static呢,也不能修饰局变量啊,它修饰的是员变量,所以呢,它来修饰的这个啊,准确点吧,成员变量的时候呢,那就相当于这个成现变量,就兼具此代这个和反种的共同的特点。它呢表达的呢,叫。
26:00
就一份是吧。而这个呢?不可变是吧,哎,所以呢,它俩合在一起修饰成列变量的时候呢,我们说呢,哎,就称为。啊,磁是成员变量,哎,就成为呢,我们叫全局敞量了。哎,全局体现呢,就只有一个,就是static的体现是吧,常量呢就是它不能变。哎,就这样的啊,在这呢,就是比如说。哎,像咱们这个mass里边的。这个派是吧?它呢,直接通过类来调的,而且还不能变啊,这不就是全局产量吗?OK啊,诶,那像咱们实际开发当中啊,像我刚才说的这个场景啊,比如我们设计一个具体这个游戏的时候呢,哎,我们可以指定的说上下左右。指定的它是具体这个值,然后在相应的方法里边你去用,诶我们指定一个值,这个值呢,你别在方法里边,你去写1234。这个呢就很懵,这一到底是左还是右啊?哎,所以呢,你把这123呢,就可以定义成了叫全局常量。
27:03
然后你在这里边儿呢,这一你就直接把一呢改写成叫left是吧。那你就知道它是什么意思了。那就可以啊。好,包括呢,你像我们后边呢,会讲这个集合,集合的时候呢,我们会讲,诶像这个叫哈希map啊这个类的话呢,我们就诶会看它这个源码,在这个源码里边呢,它其实就定义了相关的一些所谓的这种常量信息。哎,你看这里边像这些是吧,一看这就是常量了啊,哎,它表达意思就是你默认的初始化的时候的一个容量是多少。哎,你最大的一个容量是多少?默认的一个加载因子是多少?哎,你看这都是全局常量。哎,大家呢,这样做是好的,不要怎么做呢,我们在下边儿的方法或者构造器当中,我就直接写0.75。你会感觉很懵,这0.75是啥呢?好,你写个这个,这这是啥呢?是吧?诶,当然你要在下面的方法或构造器里边,你要写这个事儿,你一看就知道哦,这是一个默认的容量是吧?啊这呢是一个加载因子的意思。
28:01
所以也比较形象。啊。诶,这块拉回来啊,关于我们这块呢,整个这个知识点呢,我们就完事了啊。那其实呢,整个来讲呢,不是特别难哈,大家呢,就是了解一下啊,熟悉一下我们这个fun的使用就行了,我们平时自己在开发的时候啊。其实有的时候呢,会想不起来用final。这个为啥呢?你比如说我们这个类是吧,这个类呢,是我们自己定义的一个类。这个类呢,你说我就没有加final本身这个类呢,你还不想被继承,你就忘了加了,忘加就忘了加了。反正我自己写的,我自己知道,我不继承不就完了吗?这个方法也是一样啊,我定这个方法,这个方法呢,我就呃不需要呢,被重写,不需要被重写,我就不重写不就完了吗。我自己记着点是吧就可以了,哎,我就不去加烦了。哎,包括这个所谓的变量,当然变量这块呢,建议呢,你还是加一下,要不你有时候还真就忘了。变量你多少注意一下哈,所以呢,变量为什么我们在修饰的时候呢,呃,用final修饰呢,它刻意呢,你看还得写成大写呢。
29:03
因为呢,相当于就在提示你,你写成大写了,这就是个常量是吧。哎,比较好识别啊。那么前面这种场景呢,其实我们呃,忘了用,忘了用就忘了用了,但是对于源码来讲呢,他一定要急着用,因为他怕咱们作为用户来讲乱整是吧。你上来了就跟string呢,重新整了个子类。怕你瞎整,所以呢,他就愤怒了啊。好,这是这个事儿,然后这个完了以后呢,来咱们看一看这里边儿这个真题哈。不太难啊,两个小题目。第一道题。这个final呢,我去修饰这个X,然后呢是。注释掉了啊这样写的。啊,会有错吗?会是吧,因为这个X你是不是给它赋值了。那要我改成下边这个。这个可以,因为X值没变是吧。嗯,好,这个呢就完事了啊,看下边这个啊。
30:00
说这呢,我们有一个other这样一个重新变量啊,然后呢,我在这个方法里边,我声明的final来修饰这个other啊。哎,这个呢,注释掉了,然后呢,o.I加加。上面呢,我们造了个对象,然后把它放在这个方法形态这块,这也可以吗?诶,这个不是常量吗。对的啊。有些同学可能没反应过来呢。这个要看清楚final修饰的是谁是吧?它修饰是O,我们让这个I加价可以吗?可以,因为它是变量是吧。哎,O不能变是吧。那就意味着如果要把这行代码打开的话呢。就报错了是吧。是这意思吧?所以呢,如果我们要画一个内存图的话呢,它实际上是这样的特征哈,这呢是一个局部变量嘛,这就这个小O,这个小O的话呢,指向的是一个啊的一个对象啊,对象里边有一个I,这个I呢,没有用final修饰表示它是一个变量。这个呢,我们把O呢加了final,也就意味着它这个地址啊。
31:04
不能变了。啊,仅此而已啊O指向这个对象的这个属性呢,可以变。从这个角度来讲呢,其实大家呢,作为成员你可以啊来一句这个。情话是吧?啊,你跟你对象说呢,说呢以后呢,你就是我的final了。是吧,那意思呢,就是你准备跟他的。过一辈子了是吧,哎,说的比较含蓄一些了啊,但是呢,呃,你指向就是你给他呢加了个final呢,就是他就是这个人了,就认定他了,但是他的一些属性可是可以变。不是性别啊,比如说随着这个岁月的流逝啊,越来年龄越来越大,容颜就衰老了,这个还是变量的是吧,但是你指向的还是他。OK啊行,来这个呢,体会一下好,那这呢,关于final呢,我们就说到这儿啊。
我来说两句