final的作用
1、修饰类:表示类不可以被继承
2、修饰方法:表示方法不可以被子类覆盖,但是可以重载
3、修饰变量:表示变量一旦被赋值就不可以更改它的值
(1)final修饰类变量,只能在静态初始化代码块中指定初始值或者声明该类变量时指定初始值
final修饰成员变量,可以在非静态初始化块或者声明该变量时或者构造器中执行初始值
(2)修饰局部变量
局部变量只能有程序员显示初始化。因此在使用final修饰局部变量时,既可以在定义时指定默认值(后面的代码无法再赋值)也可以不指定默认值,而在后面的代码中对final赋值(仅一次)
(3)修饰基本类型数据和引用类型数据
如果是基本类型数据变量,则数值在初始化后不可以更改
如果是引用类型变量,则初始化后不可以指向另一个对象,但是引用的值可变
final a[] = {1,2};
a[0] = 1 变量的值可变
a = null;报错,不可以指向其他对象
final Person p = new Person();
p.setAge(20)合法
p = null 非法
2、为什么局部内部类和匿名内部类只能访问局部final变量
不管是局部内部类还是匿名内部类,他们都和外部类的地位是相同的。编译时会生成两个.class文件
public Test{
局部内部类或者匿名内部类
}
对上面的类编译之后会形成两个class文件 Test.class和Test1.class
该局部内部类如果要使用外部的变量一定要用final修饰。当外部类的对象执行完会被jvm销毁,而此时内部类未必会执行完,因此就把外部类的局部变量复制了一份作为内部类的成员变量,这样局部变量死亡后,内部类仍然可以访问它,实际是访问局部变量的copy。
而且因为内部类的成员变量时copy外部类的局部变量的,该变量修改了会影响内部类的使用,所以用final修饰防止被修改。使局部变量与内部类内建立的拷贝一致。