Java中,final关键字可以修饰 变量,方法,类。
final 修饰变量
变量初始化之后不能重新赋值。一般与 static 一起使用,并且所有字母大写。
· 局部变量 & 全局变量
1、修饰局部变量时,可以在定义时初始化,也可以先定义变量,后初始化。
public class Test {
public static void main(String[] args) {
final String s1 = ""; //定义时初始化
final String s2;
s1 = ""; //先定义,后初始化
}
}
2、修饰全局变量时,可以在定义时初始化,也可以在执行构造器时初始化。 在使用构造器初始化,并且有多个构造器时,必须保证多个构造器都能初始化,否则编译报错。
class FinalTest{
private int id;
private final int age = 18; //定义时初始化
private final String name; //构造器初始化
public FinalTest(String name) {
this.name = name;
}
public FinalTest(int id,String name) {
this.id = id;
this.name = name;
}
}
· 基本数据类型 & 引用数据类型
1、修饰基本数据类型时,初始化后值不能重新赋值。
class FinalTest{
private int id;
private final int age = 18;
private final String name;
public FinalTest(String name) {
this.name = name;
}
public FinalTest(int id,int age,String name) {
// this.age = age; //编译报错
this.id = id;
this.name = name;
}
}
2、修饰引用数据类型时,初始化后不能改变指向对象的引用,但引用的对象中的变量可以修改。
public class Test {
private final static FinalTest f = new FinalTest(1,"张三");
public static void main(String[] args) {
// Test.f = new FinalTest(2,"李四"); //编译报错
System.out.println(Test.f.getId()); //打印:1
Test2.f.setId(2); //修改值
System.out.println(Test.f.getId()); //打印:2
}
}
class FinalTest{
private int id;
private final int age = 18;
private final String name;
public FinalTest(String name) {
this.name = name;
}
public FinalTest(int id,String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
如果需要所引用的对象中的变量不能修改,则把对象中的变量使用 final 修饰。
使用例子: String类中的存储值的变量使用的是final修饰的,所以String值不可变。
final 修饰方法
修饰方法表示该方法不能被重写,为最终方法。
public final class FinalTest{
public final void test(){}
}
使用例子: Object类中的 wait(),notify(),notifyAll()方法使用的是final修饰的,确保他们在子类中不改变语义。
final 修饰类
修饰类时表示该类不能被继承,为最终类。所以,final不能与abstract一起使用。
public final class FinalTest{
}
使用例子: String类使用final修饰的,确保他们不会在子类中改变语义。
——THE END——