final关键字
final关键字:
-
final表示最终的,不可变得
-
final修饰的类无法被继承
-
final修饰的方法无法覆盖/重写
-
final修饰的局部变量只能赋一次值
-
final修饰的引用类型也只能赋一次值(引用也是一个变量,它的赋值体现为指向一个对象的内存地址)(赋值为null也不行)
即final修饰的引用,在方法执行过程中,该引用指向的对象不会被GC回收,在方法执行完才会被回收
但是,该引用指向的对象内部的数据是可以被修改的
局部变量没有默认值,实例变量系统会默认赋值,那么被final修饰的实例变量呢?
- final修饰的实例变量系统不会为其赋默认值,必须手动赋值,但是也只能赋值一次
如果赋值则报错:变量XXX未在默认构造器中初始化。 所以,如果在构造方法中给实例变量赋了值,则final修饰的实例变量在声明时也可以不用赋值了
class A{
final int val;
public static void main(String[] args) {
A a = new A();
}
}
//以上这样不行,报错:变量val未在默认构造器中初始化
class A{
final int val;
public A(){
val = 111; //赶在了系统为其赋默认值之前给其赋值了
}
public static void main(String[] args) {
A a = new A();
}
}
//以上这样可以
class A{
final int val;
public A(int i){
val=i; //赶在了系统为其赋默认值之前给其赋值了
}
public static void main(String[] args) {
A a = new A(111);
}
}
//以上这样可以
- final修饰的实例变量不会随着对象的改变而改变,即无论创建多少个对象,这个实例变量都只有一个值
因此,final修饰实例变量一般加static修饰,变为静态的,放在方法区
static final
修饰的变量称为常量,常量名全部大写
常量一般是public的,因为无法修改,因此也不用封装了