final
-
修饰类:表示该类不可以被继承
-
修饰方法:表示该方法不可以被子类覆盖(重写),但可以被重载
-
修饰变量:表示该变量一旦被赋值就不可能更改他的值
-
修饰成员变量
若修饰的是成员变量,则可以在非静态初始化块声明该变量或者在构造器中赋初始值
若是类的临时变量,则只能在静态代码块或者声明变量时指定值
-
修饰局部变量
必须由程序员显示初始化,在final修饰局部变量时,可以在定义时指定默认值,也可以在后面的代码中对final变量赋初值(仅一次)
-
修饰基本类型数据和引用类型数据
- 如果是基本数据类型的变量,其数值一旦在初始化后就不能更改
- 如果是引用类型的变量,在对其初始化后不能再让其指向另一个对象,但引用的对象值可以改变
-
为什么局部内部类和匿名内部类只能访问局部final变量?
public class Test {
public static void main(String[] args) {
Test t = new Test();
t.test(10);
}
//局部final变量a,b
public void test(final int a){
final int b = 10;
//匿名内部类
new Thread(){
public void run(){
System.out.println(a);
System.out.println(b);
};
}.start();
}
}
解析:内部类和外部类是处于同一级别,内部类不会因为定义在方法中就会随着方法执行完毕后被销毁。当外部类方法结束时,局部变量销毁,但是内部类可能还存在,就会访问到不存在的变量。为了解决这一问题,将局部变量复制一份作为内部类的成员变量(程序员不写,编译时会自动加上final关键字),这样当局部变量被销毁后,内部类仍可以访问它。局部变量复制为内部类的成员变量前提是必须保证两个变量是一样的。