final的用法
在JAVA中经常会见到final关键字,每次见到final感觉对它是既熟悉又陌生,因此觉得有必要总结一下final的用法。
final故名思意即最终、不可变。
final作为JAVA中的一个关键字,可以用来修饰类、方法和变量(局部变量和成员变量)。
一、修饰类
final修饰类时,表明这个类不能被继承,比如java中的String类及Integer等包装类。需要注意的是类中所有的方法都会被隐式的定义为final类型。
二、修饰方法
- final修饰的方法不可被重写,如果不希望子类重写父类的某种方法,就可以用final来修饰该方法。
- 类的private方法会被隐式的指定为final方法。
因为父类的private方法在子类中是无法访问的,所以在子类中是无法重写这个方法的。如果在子类中定义一个与父类 private 方法有相同方法名、相同形参列表、相同返回值类型的方法,也不是方法重写,只是重新定义了一个新方法。而final修饰的方法不能被重写,所以父类的private方法就相当于final修饰的方法。
因此上给父类的private方法加或不加final都是一样的,没有意义。
三、修饰变量
1.final修饰的变量可以分为基本数据类型和引用数据类型类型两种。
1)修饰基本数据类型变量的话,变量值在被初始化之后不能再被更改。
public class Test {
public static void main(String[] args) {
final int a = 10;
a = 20; //更改final修饰的变量,会报错
}
}
修饰形参,形参也不能被更改
public class Test{
private static void method(final int a){
a = 10; //更改final修饰的形参,会报错
}
}
2)修饰引用数据类型变量的话,引用不能再指向其他对象,不过对象的内容是可以更改的。
public class Test {
int a = 10;
public static void main(String[] args) {
final Test t = new Test();
Test t2 = new Test();
t = t2; //更改final修饰的对象,会报错
t.a = 20; //可以修改对象的内容
}
}
2.final修饰局部变量和成员变量时又有不同
1)修饰局部变量时必须在使用前就对这个变量进行一次赋值,可以直接在定义时赋值,也可以在后续代码中赋值。
public class FinalDemo{
void Methond(){
//定义的同时赋值
final int a = 10;
//没有在定义的同时赋值
final int b;
b = 20;
}
}
3)修饰成员变量在定义的时候没有赋值的话这个变量被称为“空白final变量”,空白final变量必须在构造方法或者静态代码块中赋值。
public class FinalDemo{
//定义时初始化
final int a = 10;
final int b;
final static int c;
//构造方法中赋值
FinalDemo(){
b = 20;
}
//静态代码块中赋值
static {
c = 30;
}
}