Java中的final关键字
final在Java中是一个保留关键字,可以用来声明成员变量、方法、类以及本地变量。用final声明的变量,将不能改变这个引用,否则编译器会报错。
final的几种用法
1. 修饰一个类(无法被继承)
用final修饰一个类的格式:
public final class 类名称{
//方法体
}
这个类不能含有任何的子类
//一个子类如果是final的,那么其中所有的成员方法都无法进行覆盖复写(因为final修饰的类没有子类)
final class A{
//A 是没有子类的
}
class B extends A{
//错误的, 无法从最终类A进行继承
//B类继承A类 相当于对A类功能进行扩展
//如果不希望别人对A类进行扩展,可以给A类加final关键字,如String类
}
2. 修饰一个方法(无法被覆盖,重写)
当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能被覆盖重写
格式:
修饰符 final 返回值类型 方法名称(参数列表){
//方法体
}
对于子类、方法来说,abstract关键字和final关键字不能同时使用,因为矛盾。
class C{
public final void Test1(){
System.out.println("This is final")
}
}
class D extends C{
//错误,无法覆盖
/* public void Test(){
System.out.println("This is final")
} */
}
3. 修饰一个局部变量(只能赋一次值)
一旦使用final用来修饰局部变量,那么这个变量就不能进行更改
“一次赋值,终生不变”
//对于基本类型来说,不可改变的是变量当中的数据不可改变
//对于引用类型来说,不可改变说的是变量当中的地址值不可改变
public class Test2{
public static void main(String[]args){
//局部变量
int i=100;
//重新赋值
i=200;
// 再定义一个局部变量
final int k=100;
//重新赋值
//错误: 无法为最终变量k分配值
// k=300;
}
}
4. 修饰一个成员变量(必须手动赋值)
一般情况下
实例变量如果还没有赋值的话,系统会赋默认值
final修饰实例变量:
系统不负责赋默认值,要求程序员必须手动赋值,只能赋一次,
这个手动赋值,在变量后面赋值可以,在构造方法中赋值也可以
在变量后赋值:
public class Test3 {
private final String name = "LeBron";
public Person() {
}
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在构造方法中赋值:
public class Test4 {
private final String name;
public Person() {
name = "LeBron";
}
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
/*public void setName(String name) {
this.name = name;
}*/
}