final关键字
final关键字 可以修饰 类、方法、变量;
- 修饰类: 不可被继承;(不能修饰接口、抽象类,也不可以修饰抽象方法)
- 修饰方法:不可被重写;(可以被重载)
- 修饰变量:一旦变量被赋值,就不能在更改;
- 修饰成员变量:修饰成员变量时,必须完成初始化,也可以在构造器中完成初始化;
- 修饰普通变量:一旦完成初始化就不能更改;
修饰成员变量时必须初始化,可以有以下几种情况:
1 定义时初始化
2 构造器中初始化
修饰成员变量
public class T1 {
private final int age; //编译不通过,必须先初始化;例如private final int age=10
}
修饰成员变量,不初始化,报错
但是,也可以在构造器中完成初始化,但是同时不能提供其它不含final变量的构造器
public class T1 {
private final int age;
public T1(int age) {
this.age = age;
}
/*public T1() { //编译不通过,只能提供含有final变量的构造器
}*/
}
修饰局部变量
public void func(){
final int tmp ;
tmp = 12;
//tmp = 14; //报错,final修饰局部变量时可以先不出初始化,但是一旦赋值,就不可更改;
}
修饰普通变量,可以不用立即初始化,但是一旦完成赋值则不可更改
final修饰基本数据类型和引用类型
注意,修饰基本数据类型,值不可变
修饰引用类型,是地址不可变,但是对象的内容可变;
@Data
public class Counter {
private int age ;
public static void main(String[] args) {
final Counter c = new Counter();
c.setAge(10);
c.setAge(11);
//c = new Counter(); //报错
final int[] arr = new int[2]; //对于数组也是如此;
arr[0]=1;
arr[0]=2;
//arr = new int[2]; //报错
}
}