Java final keyword
final keyword
final变量
被final修饰的变量,必须在声明时赋值,或者在构造函数中赋值,或者在代码块中赋值,不能在后面的代码中修改。
final 修饰的成员变量必须有一个默认值,否则编译器将会提醒没有初始化。
实例代码如下:
private final int age = 18;
或者如下赋值:
private final int age;
public FinalField() {
this.age = 18;
};
final 修饰的成员变量可以是基本类型,也可以是引用类型。
final 修饰的成员变量不能被修改,但是引用类型的变量指向的对象的内容是可以修改的。
实例代码如下:
public class Pig {
private String name;
public Pig() {}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
虽然我么们不能修改 final 修饰的成员变量,但是我们可以修改引用类型的变量指向的对象的内容。
实例代码如下:
public class FinalField {
private final Pig pig = new Pig();
public void out(){
this.pig.setName("Joudys");
System.out.println(this.pig.getName());
}
}
final和static 一起修饰的成员变量叫做常量,常量名必须全部大写,单词之间用下划线分隔。
实例代码如下:
public class FinalField {
private final static String NAME = "Joudys";
}
final方法
被final修饰的方法,不能被重写。 如果我们在设计一个类的时候,认为某些方法不应该被重写,就应该把它设计成 final 的。
Thread 类就是一个例子,它本身不是 final 的,这意味着我们可以扩展它,但它的 isAlive() 方法是 final 的。
public class Thread implements Runnable {
public final native boolean isAlive();
}
需要注意的是,该方法是一个本地(native)方法,用于确认线程是否处于活跃状态。而本地方法是由操作系统决定的,因此重写该方法并不容易实现。
学习思考
一个类是 final 的,和一个类不是 final,但它所有的方法都是 final 的,考虑一下,它们之间有什么区别?
前者不能被继承,也就是说方法无法被重写;后者呢,可以被继承,然后追加一些非 final 的方法。
final类
如果一个类使用了 final 关键字修饰,那么它就无法被继承。
例如,String 类就是一个 final 类,我们不能扩展它。
public final class String {
public String() {}
}
为什么 String 类要设计成 final?原因大致如下:
- 为了实现字符串常量池;
- 为了线程安全;
- 为了 HashCode 的不可变性;

浙公网安备 33010602011771号