00:00
那刚才在咱们复习里边呢,提到说这块,诶关于局部内部类使用的时候有一个小的注意点,这块呢,这个注意点其实在咱们做后台开发这块呢,其实遇到比较少,这个做前端开发的,那前端开发跟咱们Java有啥关系呢?这不还有一个安卓开发嘛,在安卓带开发的时候呢,经常会问一个小的知识点啊,这块咱们把这个小的知识点呢稍微提一下啊,这个呢,我们新建一个工程这16,诶下边呢,我们去新建一个包,行这里边的话呢,我们新建一个叫inner class,诶关于它的一个测试行,在这里边呢,我们先把这个知识点呢先来描述一下,就是我们在外部类里边呢,我定一个方法,这呢我就是一个普通的一个方法了,在这个方法里边,我们再定一个叫局部内部类,这呢我就简单的写了一个A,然后这个局部内部类里边呢,我们是不是也可以再定义方法呀。
01:00
对public word我写一个,比如叫这个授方法收方法,好,那这个授方法当中是我们叫什么呀,叫局部内部类的方法中,如果我们要是想使用什么呀,使用这个局部内部类,它所在的这个方法中的这个属性的话,就是我们那个method里边有一个,这呢相当于是个就变量,这有个就变量,比如我定一个特,那个number是个十,如果我们在这个受方法这里边,我想用这个十,你看我直接呢,在这我sit out一下。没有问题可以用,那这想说的知识点什么呢?就这个number啊,它其实有个要求,这个number呢,它得是一个final的,言外之意就是如果我们这个number呢,我想给它重新赋值,你会发现呢,它会报错,报错呢这块写的信息说我们这个局部变量这个number呢,它定义的时候呢,它得是一个final的,嗯,就是这个事儿的话呢,比如我这儿我注释一下啊,就这个事儿的话呢,我在这用了,然后这块没有报错,这个呢,限于咱们JDK8及以上的版本,如果大家呢,用的是七及之前的版本,在这个位置呢,它会先打一个叉,打叉呢你往这一放,他说要求这个number呢,必须声明成final的,就是在JDK7和以前的版本当中,需要我们明确的在这加上一个final。
02:24
加上一个final,而我们这个JJ8及以上的版本呢,这个不用去加final了,但是呢,它本身还是一个final,相当于这个它自动的给你识别为一个final了,先把这个知识点呢,我们简单的在这描述一下知识点啊,就是说在局部内部类的的方法中,就是咱们这个收方法。比如这个收方法,在局部内部类的方法中,如果调用局部内部类,它所在的这个啊,所声明的这个方法中的局部变量的话,有点绕。
03:08
哎,想调用局部内部类,它所声明的这个方法也是我们这里边method的方法。想用我们这个method方法当中的这个局部变量的话,就是我们这个十,呃,这个number,那么我们说要求词局部变量这个声明为final。这个就变量在我们这个问题当中,就是比如是我们的这个number,哎,就它。也需要呢,它是一个final的,那就是这样的一个意思啊,那么大家可能会问一个问题,说为什么这个非得要生明成一个final的。对吧,Final意味着是不是就是个常量啊嗯,那为什么说这个量你只能是在里边用,不能够去修改呢。嗯,这个呢,大家可以当成是一个规定对吧,规定的话呢,就意味着是不是就不需要解释了是吧?问为什么呢,没有为什么规定是吧?诶你可以这样去说,那当然了,你要非要理解一下,说说为什么要有这样的规定呢?我们可以简单说一下,咱们刚才提了个事,说我们这个外部类的话呢,是不是生成一个自解码文件,然后你这个内部类的话呢,是不是也是一个独立的自解码文件,这其实相当于是两个文件了,两个文件呢,其实就对应的两个类,然后呢,你想想我们这个方法,这个方法本身它是不是应该是存在我们这个web类的这个结构里啊,相当于这个we部类这个文件当中,我们有个M方法里边呢,有个number变量。
04:41
A,这个number变量按正常来讲是不是出了,你这个方法就失效了。就失效了,所以你这只是局部能局部内用的一个结构,而我们这呢,是有一个独立的一个文件了,这个文件里边呢,我既然用了你这里边儿的一个变量了。那这时候呢,其实就涉及到你可以说从这个生命周期的角度啊角度来讲,就是你这个变量的话呢,它其实出的方案就没有用了,而我们在另外一个独立的结构当中又用这个结构了,那这个结构呢,首先呢,你得保证能用,从这个嗯,咱们讲这个内部类这个结构来看,因为你是定义在方法里边了,我这个变量呢,这个人家是定义在这对大括号当中。
05:16
从这个作用域上来讲的话呢,我覆盖了你这个内部类。就按说呢,我在里边调是应该没有问题的,这是从语法上来讲,但是另外一方面呢,你其实又出了,从那个生成的文件上来讲,你又出了我这个本身这个类的结构了,换到另外一个文件里了,这个生命周期呢,其实延续下来也有困难,那这时候呢,我们先其实相当于加上个final,表示的意思是什么呢?就是我这个变量呢,其实出了方法以后呢,就失效了,但是你要想在外部类里,内部类里边还想用的话呢,我实际上给你传的是一个副本。副本呢,你可以理解为就是一个复制品,就是跟你其实就相当于重新复制了一个变量,然后让你去用的,那么这个副本呢,就意味着说我这外表是什么,一里边呢,你只能去用,你就不能改了,因为你改你也改不了我,我这块呢,传进去是个副本,不是我本身啊,那就意味着你只能去用,不能够去改,那这时候呢,我们就加上final,就意味着你能用不能改,就是一个常量。
06:15
呃,就是这样的一个意思啊,那如果大家呢,听起来有点困难了,你就可以记住这样一个点就可以了啊,就是这样的一个要求,这个要求呢,咱们刚才提了一下,说在这个JDK7及这个之前的这个版本,诶及之前那版本呢,我们说要求这个显要求此局部变量,哎,局部变量就显示的。啊,诶,声明为是一个final,那那我们在这个JDK这个八啊及之后的版本,这个呢,我们说可以省略这个繁重的声明,哎,这就相当于就跟咱们这个说接口中定义的都是全局常量一样,那你既然都得写成public static final,干脆呢就省略不写了,诶这个一样,这个因为你每次都去加个final还挺麻烦的,干脆呢就省略不写了,所以这是从语法上的一个优化,但是仍然它是存在这个final的,行,这就完事了,那么这种情况呢,我说呀,在这个移动端开发当中,实际上是比较常见的啊,这个为什么说移动端开发比较常见的,简单说一下例子,虽然咱们在座的各位大家都不做这个安卓开发是吧,但是在安卓开发里边经常会有这样的一些操作哈,比如呢,这是一个手机页面,这个手机页面呢,它其实对应的一个就是activity了,这个就是一个具体的组件,你可以看成整个的页面呢,相当于我们有一个类。
07:39
有一个类的对象呢,去去表示咱们不是面向对象编程吗?整个这个页面的话呢,你可以列为我们对应的有一个组件叫activity,我们去提供这个activity具体的一个子类了,这个子类里边我们需要写其供了一个生命周期方法,这个方法呢,我们叫做哎,叫on create一个方法。
08:00
这个方法呢,就是说当咱们举个例子啊,比如说大家呢,你这是一个手机的一个应用的页面了,然后呢,下边比如说有一个或者一个超链接,或者你下边有一个按钮,我一点的时候呢,是不是又会出现一个新的页面。出现这个新的页面,在一出现的时候,这呢我们说就会对应着某一个类的对象,这个类呢就activity了,那这个页面呢,一加载一显现成功,它就会自动的去调一个方法叫on create方法。哎,就把这个方法就调用了,调用完以后新的这个页面当中,咱们有很多的这个具体的视图,就是你好多看到的一些文本啊图片呀,是吧,每一个独立的结构都是一个view,都是一个视图结构啊,那么假设我们新开的这个页面当中有一个按钮。有个按钮,我一点那按钮,他那可能给你弹一个东西,或者又转到其他页面等等,那我点那个按钮的话呢,相当于我触发了一个事件。就这个事件呢,就就执行了,对吧,那这时候怎么去体现这个事儿呢?相当于我们在这个你这个页面整个加载的时候呢,我有个方法,这个方法里边咱我就不写那么细了啊有一个按钮,这个按钮呢是一个button啊,哎我就先直接来用了啊,然后我给这个按钮呢,去设置一个啊叫监听了,就是set,一个叫on click的一个listener,哎,设置这样的一个这个这个监听器,相当于是,哎这个监听器呢,在这里边呢,就需要我们传一个对象,这个对象呢,就需要我们去拗一个,比如new,一个叫view点叫on,诶,Click listener。
09:36
这样子,那这个on click listener这哥们儿呢,是一个接口。那你这块去拗个接口那不合适了,那实际上就理解为是这个接口的匿名实现类的对象了,那我这里边儿呢,是不是就得需要去在这儿重写一个人家的方法了。那这不就也体现了咱们所谓的这个叫异名对时间类的对象了,那那这个接口里边的方法你得在这写一下,这个方法呢,它叫public VO叫onli的方法。
10:09
这就相当于是一个回调方法了,就是当我们去通过这个按钮,大家点一下这个按钮上,点一个这个页面上的这个按钮的时候,我一点这个按钮,它就触发了一个事件,或者叫触发了一个监听器的执行,就是这个监听器里边我这写了个方法,比如说啊在这个位置这个这个其实人家是从这个界面上展示出来的,咱们在这我我就举个例子啊,我这写个输出语句啊,我就写个hello,写个hello,这个相当于什么呢?我这页面上我有个按钮,我一点这个按钮,它这块呢,直接就hello了。就把它就执行了这个意思,那么你看这个结构,这个结构呢,我是给写到里边了,我现在给它拿出来,拿出来你可能就更清楚一点啊,拿出来我是不是就放这儿啊,我要放这的话呢,前面你得声明成一个对象啊,那我就只能声明成叫will.on click listener,这呢是一个具体的。
11:03
距离是个listener,然后呃,报错你不用管,那这呢,你看这不就相当于我们其实相当于是不是提供了一个匿名的一个局部内部类的一个对象了,这不就跟咱们昨天讲的,这是我一个这个这个算是局啊局部内部类了,只不过这个没有一个显示的名,我们是一个匿名的了,这呢也算是局部内部类的一个使用,这不是你在方法里边用的嘛,嗯,然后呢,你把这个listener我就相当于给放到这了。哎,这就这样的情况,这呢,首先体现了这叫局部内部类的一个使用了,这就举了个场景行,然后的话呢,我们在这个on create的时候呢,这个位置我有可能会定义一些变量,比如说我这假设我就定义了一个叫number是个十这个变量我就定义好了,这个变量呢,咱们要是在这儿用的话。哎,我这呢去输出延展本这呢不就构成了这是一个外部类的方法,这是一个局部内部类,在局部内部类的方法当中,我们想用一下这个内部类它所声明的方法当中的一个这个这个变量。
12:13
这就涉及到这个number的问题,这个number呢,就要求它得是一个final的,是不是就刚才说的这个场景啊,对,这就要求他是个final的,这种情况呢,在移动开发当中非常常见,所以说呢,就是在比如说做这个安卓开发的人,在面试的时候呢,经常会问说这个要求是什么啊,要求你把它说出来,那为什么有这样的要求,你可以简单解释一下啊,或者说呢,咱们在开发当中,你这个number呢,就只能在这用,当你试图改的时候呢,就一定会报错啊,就这个意思行这个事儿的话呢,大家咱们做后台开发呢,你这块呢,稍微理解一下就可以了啊,就有这样的一个额外的要求啊,把这个事呢,我们这样CTRLC粘到咱们这个位置关注一下就以了。诶这样呢就行,嗯,这个呢,我们把这个字变小一点,CTRLS好,那整个关于我们这个面向对象的内容呢,我们算整个呢,就讲解完成啊。
我来说两句