final 关键字的好处:
1.final 关键字提高了性能,JVM 和 Java 应用都会缓存 final
2.final 变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销
3.使用 final 关键字,JVM 会对方法、变量以及类进行优化
Java关键字 --- final
- 一、修饰变量
- 二、类的 final 变量和普通变量的区别?
- 三、修饰方法
- 四、修饰类
一、修饰变量
- 当 final 修饰一个基本数据类型或者引用类型时,一旦在初始化之后,值不能改变,但是引用类型指向的对象的值是可以改变的(因为引用类型存的是一个地址,被 final 修饰时,地址不变就好了)
- final 修饰成员变量是,必须要显示初始化,要么是在声明的时候赋值,要么是在该变量所在类的构造函数对变量进行赋值,局部变量则是在使用之前初始化就好了
- 注意:final 修饰对象,进行声明时,必须初始化的值要是具体的对象,不能是指向另一个对象
public class finalTest {
public static void main(String[] args) {
final person pers = new person();
pers = new person();
}
}
class person{
String name = "张无忌";
}
例如上述代码中:pers = new person();
在编译是就会报错,就是因为pers 被 final 修饰,不能再指向其他对象
二、类的 final 变量和普通变量的区别?
- 例子:
public class staticTest {
public static void main(String[] args) {
String A = "final999";
final String B = "final";
String C = "final";
String str1 = B + 999;
String str2 = C + 999;
System.out.println(A == str1);// true
System.out.println(A == str2);//false
System.out.println(str1.equals(str2));//true
}
}
- 可以从结果看出,
str1
和str2
两个对象的内容是相等的,但是之所以一个为 true,一个为 false,就是 final 修饰变量和普通变量的区别了
首先,对象 A 的值"final999"存储在常量池,str2 的值为引用变量 C 拼接"999",对应变量 C 的访问需要在运行时通过存储的地址才能确定,而 str1 被 final 修饰,当变量为基本数据类型、String类型时,编译器会把他当作编译期常量使用(静态绑定),也就是编译期的时候,str1 的值就完成了拼接,为"final999"
三、修饰方法
- 使用 final 方法的原因:其一是将方法锁定,防止任何继承类修改它的含义,其二是提高效率,因为在编译时已经静态绑定了,不需要在运行时动态绑定
- 父类中被 final 修饰的方法,不能被重写(因为重写的前提就是子类继承父类的方法),需要注意的是,如果父类中 final 修饰的方法同时访问权限为
private
,子类就可以定义相同的方法名和参数,因为子类没有直接继承,而是重新定义的
public class finalTest extends A {
public static void main(String[] args) {
}
public void set() {
}
}
class A {
//当方法为public时,报错
// public final void set(){
// }
private final void set() {
}
}
四、修饰类
- 当 final 修饰一个类时,表明这个类不能被继承
- 需要注意的是:final 类中的成员变量可以自行设为 final,但是 final 类中所有的成员方法都会被隐式地指定为 final 方法
- 使用 final 修饰类的时候,谨慎选择,除非以后不会用来继承或者出于安全考虑