音频文稿:
再来看两道翻脸相关的面试题啊,第一道是减速翻脸的作用啊,也就说这个翻脸,这个关键字到底是什么含义啊,干什么用的,那那么第二道了,这个这个面食题呢就有一定的难度啊,为什么局部内部类和匿名内部类呢,只能够访问局部的范围变量啊,这个面试题呢,可能对于很多的程序员来说,可能只知道了,就是我在逆迷内部内,或者是局部内部内,里面我要去访问局部变量啊,必须加一个范的变量,至于为什么要这样去做,可能很多人不知道是什么原因啊,好了我们接下来呢,来看一下这两道面试题呢,怎么样去作答啊,好首先第一个,是这个翻了变量的这个含义啊,还是做什么用的,翻了呢它的含义其实就是最终的嘛,那么在我们加法中翻了呢,可以用来修饰类修饰方法修饰变量,如果是修饰类的话意味着了这个类了,不可以被继承啊,也就相当于被淹割了啊不可以由此类,如果是修饰的是方法的话,那么这个方法呢,不可以被子类覆盖,其实跟第一个呢有点类似啊,就是说这个方法了,不可以被相当于不能被子类去重写啊,不能被重写但是呢可以重载,也就是说你这个行餐列表,或者是返回值,你改变一下这个呢,也没有问题也可以啊,但是不能重写啊不能覆盖可以重载,如果是修饰的是变量了,那么表示这个变量,那么表示这个变量
一旦被复值就不可以了,更改他的值,那么针对翻译的这三种这个特性呢,可能很多人都知道啊但是,其实呢,他还有很多一些细节性的东西啊,我们来看一下,首先啊他修饰变量,如果他修饰的是成员变量,我们来看一下,那么如果是修饰的像这种这种啊,b 这种普通的这种成员变量的话,那么在声明的时候,就必须要给他复制或者了在这个啊,普通的这个代码派中啊给他复制,其实这就是一个初始块对不对,给他去复制,或者是了在构造器里面去给他复制,那么,如果说你不在这三个地方负值的话,那么你再去用这个,值的时候他就会了报错啊,还有如果是静态的,如果是静态,也就说是内边量哈是内边量,内边量的话,那么呢,一样的要在声明的时候就需要复制,或者是在静态代码快中去复制,那么这个是 feel 的这个限制啊好,如果是第二,如果是修饰的是局部变量的话,那么系统呢,他不会为这个局部变量进行说实话啊,也就是说,局部变量必须由城市,程序员的显示的去充实化,也就是说你在使用这个变量之前,一定要对他复制啊,并不是说一定要一定要像这样啊,一定要像这样,写的时候就去给他复制啊,不是说这样写就像这里啊像这里,并不是说这个写的时候就要给他复制,并不是说这个写的时候就要给他复制
而是说在用的时候要给他复制啊,局部变量了,只声明没有出示话不会报错,但是在使用之前一定要复制,那么这个是翻了的这个限制啊修饰啊,局部变量好那么,如果修饰的是基本,类型跟引用类型数据啊,这里呢要注意一下,如果修饰的是基本类型的变量,那么呢是这个基本类型的这个数值啊,我们基本类型的数值,一旦在初始化之后就不能够修改了,比如说你一个硬的 i 等于1,然后加了个 Ifni,那么这个 i 呢,就只能等于1,你就不能够再把这个 i 了改成2啊,那么如果是引用类型变量的话,那么在对其初始化之后啊,不能够让他再指向另一个对象,也就是说这个等于号不能够再用,但是呢这个引用的值呢是可以变的啊,我们来看是什么意思啊在下面这个,比如说我们修饰一个数组,那么这个数组呢现在呢嗯,就是一个翻等修饰的,但是呢我们可以去修改这个,数组中的就是某一个值,比如说修改他的下标为2的,这个这个值啊,但是如果你要用这个等于号,对这个数组重新去啊,付他这个引用,引用地址的话是不可以的啊,这是不可以的,那么像下面这种我们普通,我们的这个对象也是一样的,比如说这个破损对象,那么你要给这个屁重新去负一个值啊,那么你要给这个屁重新去负一个值啊
比如说你嗯,-1个 now 或者是-1个 pe,都是不行的,但是你可以修改它里面的属性,这是可以的啊好,那么这个是翻了的,这个简单的一个作用啊,以及他的一个简单的用法,那么第二道面试题啊,为什么局部的内部类和匿名内部类啊,只能够访问局部的翻斗变量,这是什么原因呢我们来看一个例子啊,那么我们这一个 tst 的类对吧,这个有个卖方法,然后呢里面呢有一个,有一个 tst 的方法,这里面呢有一个匿名类不类啊,有个匿名类不类,那么这个匿名类不类了,他要去访问这个变量一个变量了,是这个类不变一个局部变量而印的,a 等于10,还有呢是一个型差,那么这个型差的,实际上也是一个局部变量啊,这两个局部变量,必须要加上一个翻等参数,如果你不加翻等参数的话,那么这个地方呢变异就会爆错啊,还有第二个例子,啊第二个例子呢是这种啊,局部内部内啊,上面是匿名内部内这个呢,是局部内部内,局部内部内也是一样的,当然你反问外部的这个啊,成员变量是没有问题的成员变量呢,不需要范冷修饰,但是你访问局部变量的话,这个 x 一定需要这个翻冷修饰啊,那么如果没有这个翻冷修饰,那么如果没有这个翻冷修饰
直接就会变异报错,什么原因导致的,首先呢我们要理解一点啊,我们的这个,局部内部类或者是这个匿名内部类,他在编译之后,会生成两个 class 文件啊,比如说我们这个 tst,它在编印之后,他实际上是对应两个 class 文件,一个是 tst 的点 class,还有一个是 tst 1点 class,也就在我们的这个内名后面加一个,1啊,就是这个内部类变异之后啊,会生成两个克拉斯文件,好明白了这一点我们来看,什么是是是什么原因啊,我们的内部类和外部类了,实际上是同一个级别对吧,因为他们都是一个克拉斯文件啊,内部类了,他不会因为定义在方法里面,他就是会随着的这个方法执行,完了就会被销毁,他是不会的啊,比如说我们上面这个,我们这个面方法执行完了,实际上我们这个,这个县城呢就推出了对不对,但是我们比如说我这个方法,这个方法这是个累不累对不对,这个累不累,我们外面的这个方法执行完了,里面这个会被销毁吗,不一定因为我们是里面是个县城,对不对比如说我这个这个,这个是个 smart 的,这个县城呢几乎可能还没跑完啊,这个时候,不能因为我们,外面的这个方法执行完了,然后呢里面的这个就回收,然后呢里面的这个就回收
这个是不科学的,对不对,因为里面这个可能还没跑完呢,那么下面这个也是一样的啊,我里面的这个克拉斯,不会,随着外面的那个克拉斯的回收而回收,啊这个是这个类不类的一个,就是在这个内存这一块的一个,一个定义对吧,那么这个累不累,跟外部累是同一个级别的啊,他不会因为外面的这个方法执行完了,那么累不累就会回收他是不会的啊,他还在那么,这里呢这样的话就会产生一个问题啊,那么如果外部累啊方法结束对不对,我们看我们这里呢,这个累不累了,反问了这个外部内的一个变量对不对,还反问了这个变量啊,那么,如果说这个外部外部的这个方法呢,执行结束了那么局部变量呢,按道理了就应该要销毁对不对,这是我们的这个,呃垃圾回收的这个机制啊,那么你这个,方法都执行完了局部变量呢,肯定是要回收的,但是这个时候你这个局部变量了哎,被这个累不累所以用了,而这个时候,你如果把这个变量要是,把它给回收的话,那么我们累不累,使用的这个变量怎么办呢,那么相当于就引用了一个什么,引用了一个不存在的一个变量对不对,相当于啊累不累,引用了一个不存在的变量,那么这个时候肯定不行对不对,那么为了解决这个问题了就将了,那么为了解决这个问题了就将了
这是我们的这个节目的机制啊,为了解决这个问题啊,将局部变量着,将这个局部变量啊,就复制一份放到这个内部内,里面作为一个成员变量,也就是说这个 ag 啊,实际上他是复制了一份放在了,这个内部内里边的啊,如果有兴趣的大家可以去看一下,编辑之后的那个自检码啊,可以去看一下自检码,那么外面的这个,这个变量,实际上是会复制一份,放到这个内部内里面去的,这样的话呢当这个局部变量,如果如果说我这个方法执行完了,对不对那么局部变量要回收,对不对局部变量回收了那么累不累了,依然可以访问他,因为已经复制了一份啊,所以,据说实际访问的是局部变量的一个,copy 就是一个拷贝啊,这样好像是,延长了这个局部变量的一个生命周期,对不对本身呢,应该回收的啊,但是我们这这个时候呢,拷贝的一份放到了这个内部内里边,但这个时候呢,他又会产生一个问题了啊,什么问题了,你将局部变量啊,将局部变量复制到这个内部,内的这个成分变量里面,那么这个时候呢,必须要保证这个两个变量呢,是一样的对不对,因为你外面一份里面一份,那么如果这两个变量,他这个只要是不一样的话,那么这个程序也是有问题的,对不对因为我累不累,对不对因为我累不累
你用的就是你你外面的那个呃变量啊,如果这两个变量值得不一样,那怎么办呢对不对,但是呢如果说你不做特殊处理的话,那么你拷贝一份按道理呢,他就有可能不一样对不对,我累不累里面改可能就把他给改了,那么你外部人很感知不到啊,这个时候呢,那么就是说如果我们在内部内啊,修改了成分变量的话,方法中的局部变量了也得更是改变,这个怎么解决呢,就通过这个翻转啊,那么就必须要加一个 fired,其实呢这也是一种妥协,就是一种妥协啊就是说,必须让这个局部变量加一个 fei 的,这样的话,这个 fil 呢他的直就不能变了啊,也就是说对他出示话后,我就不让你去修改这个变量,保证内部内的这个成员变量和方法的,这个啊局部变量呢他是一致的啊,实际上就是一种妥协嘛对吧,使得这个局部变量与内部内,里面建立的这个好背的,他们永远是一致的啊,这就是为什么我们说这个,局部变量或者是匿名类不类啊,局部类不类或者是呃匿名类不类,他只能访问局部,翻轮的变量的一个原因啊,其实这个变量必须使用翻轮来修饰,