final 关键字的作用是防止数据被修改,保证代码的安全。
可以修饰类、类中的方法、变量、参数
修饰类
如:String 类
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
...
}
被 final 修饰的类,表示该类不可以被继承,防止被修改。
修饰方法
当不希望子类重写父类的某个方法时,可以使用 final 修饰该方法
public class Person {
final String getTemp(){
return "temp";
}
}
public class Son extends Person{
// 编译失败
@Override
String getTemp(){
return "temp1";
}
修饰变量
必须初始化,否则编译失败。要么在定义时给值,要么在构造方法中给值,不能同时在定义时赋值,又在构造方法中赋值。
public class Person {
// Variable 'a' might not have been initialized
// final 修饰的变量必须初始化,否则编译失败
final String a ;
}
public class Person {
final String a ;
// 在构造方法中初始化
public Person(String a) {
this.a = a;
}
}
public class Person {
// 声明变量时初始化
final String a = "";
}
final 修饰变量与普通变量的区别
String a = "java11";
final String b = "java";
String c = "java";
String d = b + 11;
String e = c + 11;
System.out.println((a == d)); // true.final 修饰变量b,在编译器就能确定变量b的值,
编译器会把变量b作为常量处理,而不需要在运行期才知道具体的值
System.out.println((a == e)); // false.c 没有用final修饰,所有在运行期才知道具体的值。
只有在编译器明确知道final值的情况下,编译器才会进行优化。
如下代码不会进行被编译器优化
public static void main(String[] args) {
String a = "java11";
final String b = getL();
String d = b + 11;
System.out.println((a == d)); // false
}
public static String getL(){
return "11";
}