final
概述
由于Java当中提供了继承特性,子类可以在父类的基础上改写父类的内容,比如:方法的重写,那么能不能随意的继承API当中提供的类呢,改写其内容呢?显然是不行的,为了避免这种随意更改的情况,java提供了final关键字,用于修饰不可改变的内容。
- final:不可变。用于修饰类、方法和变量
- 类:被修饰的类,不能被继承
- 方法:被修饰的方法,不能被重写
- 变量:被修饰的变量,不能被【重新赋值】
使用方式
- 修饰类
public final class 类名{
}
- 修饰方法
在这里插入代码片修饰符 final 返回值类型 方法名(参数列表) {
// 方法体内容。。。。。
}
重写final修饰的方法,编译无法通过。
- 修饰变量
- 修饰局部变量——基本类型
基本类型的局部变量,被final修饰后,只能赋值一次,不能被更改。代码如下:
在这里插入代码片public class Demo {
public static void main(String[] args) {
// 声明局部变量
final int num;
// 第一次赋值
num = 10;
// 第二次赋值
num = 20;// 编译报错
}
}
- 局部变量——引用类型
引用类型的局部变量,被final修饰后,只能指向一个对象,地址不能发生改变,但是不影响对象内部的成员变量的修改。代码如下:
public class FinalDemo2 {
public static void main(String[] args) {
// 构建一个对象
final People p1 = new People();
p1 = new People();// 报错,编译无法通过
// 调用setName()方法
p1.setName("小王");// 可以修改
}
}
- 成员变量
成员变量涉及到【初始化】的问题,初始化方式有两种,二选其一:
显式初始化:
public class People {
final String NAME = "小王";
private int age;
}
构造方法初始化:
public class People {
final String NAME;
private int age;
public People(String name) {
this.name = name;
}
}
备注:被final修饰的常量名称,一般都有书写规范,所有字母均为【大写】。