基本概念
final 有“这是无法改变的”或者“终态的”含义。
final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。
final 变量
1.基本数据类型和引用类型
对于一个 final 变量:
如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改。
如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
class Person {
public int name = 0;
}
public class Test {
public static void main(String[] args) {
final String word ;
final Person person;
word ="hello";
person = new Person();
// 再次赋值,编译器报错
word="hello";
// 修改引用,编译器报错
person = new Person();
// 输出:1,表示引用对象的内容是可变的
System.out.println(++person.name);
}
}
2.final 常量和 final 变量
当 final 变量是基本数据类型以及 String 类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。
public class Test {
public static void main(String[] args) {
// 在编译期就能知道确切值 --> 是编译期常量
final String a1 = "good";
// 编译期常量被更改时会直接替换为自己的值
String b1 = a1 + "bye";
// 因此输出 true
System.out.println((b1 == "goodbye"));
// 普通变量
String a2 = "good";
// 更改值时通过更改对象的引用链接来实现
String b2 = a2 + "bye";
// 因此输出 false
System.out.println((b2 == "goodbye"));
}
}
如果在编译期间不能知道它的确切值时,会是怎样的情况呢
public class Test{
public static void main(String[] args) {
// 此时 a 相当于是一个引用类型
final String a =getWord();
String b = a+"bye";
//false
System.out.println(b=="goodbye");
}
public static String getWord(){
return "good";
}
}
final 类
final 修饰一个类时,表明这个类不能被继承;
private 修饰方法会隐式地被指定为 final 方法;
final 类中的所有成员方法都会被隐式地指定为final方法。
final 方法
把方法锁定,方法可以随着类继承得到,但不能被重写;
高效,由于不能被重写,但是不能实现动态绑定,只能实现静态绑定;静态绑定表示在编译期就可以确定具体的对象,从而提高性能。