final是java中的一个关键词,是域、方法和类的修饰符,通常的作用是来表述被修饰的内容是无法改变的。
-
final数据
作用:一个恒定不变的编译时常量可以减轻运行时的负担,或者我们还可以定义一个运行时被初始化再也无法被改变的值。
(1)修饰成员变量,只能在变量定义时或构造函数中初始化,否则编译不通过。
//基本类型的成员变量必须只能在定义时初始化,但并不意味着编译时可以确定值
private final int num = new Random().nextInt(9);
//final类中的属性,可以定义为非final属性
private final String name;
//变量定义时做初始化的方式
private final Date date = new Date();
//final修饰的成员变量可以在构造函数中进行初始化
public Tools() {
this.name = "tools";
}
//在构造函数种使用表达式初始化,同样满足final域在使用前被初始化的要求
public Tools(String name) {
this.name = name;
}
(2)修饰方法参数,基本数据类型值不可变
(3)修饰方法参数,引用类型可以更改对象值,但引用不可变
(4)修饰匿名内部类调用的局部变量
在jdk8中,也可以不用显示的使用final修饰该局部变量,如果局部变量被匿名内部类访问,那么该局部变量相当于自动使用了final修饰(effectively final)。但如果涉及对该局部变量的修改,则会不隐式使用final修饰,匿名内部类中报错。
interface Task {
void run();
}
public void exeute() {
int num = 1;
Task task = new Task() {
@Override
public void run() {
System.out.println("执行个数:" + num);// num被隐式修饰为final,如果59行代码放开会报错: Variable 'num' is accessed from within inner class, needs to be final or effectively final
}
};
// num = 2; //如果这里放开会报错,匿名内部类中使用num和方法中修改局部变量不能同时存在
System.out.println("执行个数:" + num);
}
-
final修饰方法
用户方法锁定,防止任何继承类的修改,不会被覆盖
private 方式隐藏式指定为final,因为方法不会在任何情况下被覆盖。
-
final修饰类
对该类的设计不做任何变动,不能继承
由于final类不能继承,所以final类种的所有方法都隐式指定为final方法,因为无法被重写。