说明:
final是java的一个关键字,是最终的意思。
final 表示"最后的、最终的"含义,变量一旦赋值后,不能被重新赋值。被 final 修饰的实例变量(就是已经实例化的对象)必须显式指定初始值。
final 修饰符通常和 static 修饰符一起使用来创建类常量。
修饰类:表示类不可被继承
修饰方法: 表示方法不可被子类覆盖(可以继承!但是不可以重写!声明 final 方法的主要目的是防止该方法的内容被修改),但是可以重载(在一个类中)
修饰变量:表示变量一旦被赋值就不可以更改它的值。
(1)修饰成员变量(成员变量是指在一个类中定义的变量):
如果final修饰的是类变量(也就是静态变量)--->归类所有,只能在静态初始化块中指定初始值或者声明该类变量时指定初始值.
如果final修饰的是成员变量 -->每个实例可以定制的,可以在非静态初始化块、声明该变量或者构造器中执行初始值.
(2)修饰局部变量(局部变量是指在方法中定义的变量):系统不会为局部变量进行初始化,局部变量必须由程序员显示初始化。因此使用final修饰局部变量时,即可以在定义时指定默认值(后面的代码不能对变量再赋值》,也可以不指定默认值,而在后面的代码中对final变量赋初值(仅一次)---〉使用前要赋值,也就是不能为空?null?
(3)修饰基本类型数据和引用类型数据
基本类型:其数值一旦初始化后便不能再更改;
引用类型:初始化后不能指向别的对象(不能置为空),但是引用的值是可变的;
相关的面试题:
1.为什么局部内部类和匿名内部类只能访问局部final变量?
(内部类分为局部内部类和匿名内部类...)
可以直接访问外部类的所有成员(也就是非局部的?),包含私有的
内部类编译之后会生成两个class文件,内部类和外部类是同一个级别,它们都是一个class文件;里面的class不会随着外面的class回收而回收,局部内部类和匿名内部类只能访问局部final变量,是为了解决外部类被回收后,变量也跟着消失了,此时内部类就拿不到变量了,但是如果拷贝一份,外部变量变化感知不到,就会出现差异,所以限制内部类只能使用final修饰的变量。