文章目录
final
不可改变,可以用于修饰类、方法和变量
前言
了解继承的程序猿们都知道,子类可以在父类的基础上改写父类的内容,比如:方法重写,那么我们能不能随意的继承API中提供的类,改写其内容呢?显然这是不合适的。为了避免这种随意改写的情况,所以Java提供了final
关键字,用于修饰不可改变的内容。
使用方式
final的使用方式有三种,类、方法和变量
final修饰类
被修饰的类不能被继承
格式如下:
final class 类名 {
}
举例:
final class Fu {
}
// class Zi extends Fu {} // 报错,不能继承final的类
查询API发现 public final class String、public final class Math、public final class Scanner等,很多我们学习过的类,都是被final修饰的,目的就是供我们使用,而不是让我们随意改变其内容。
final修饰的方法
被修饰的方法不能被重写
格式如下:
修饰符 final 返回值类型 方法名(参数列表){
//方法体
}
举例:
class Fu2 {
final public void show1() {
System.out.println("Fu2 show1");
}
public void show2() {
System.out.println("Fu2 show2");
}
}
class Zi2 extends Fu2 {
// @Override
// public void show1() {
// System.out.println("Zi2 show1");
// }
@Override
public void show2() {
System.out.println("Zi2 show2");
}
}
final修饰的变量
被修饰的变量不能被重新赋值,即变量只能被赋值一次,一开始被赋值,之后就不能被赋值,如果一开始没有,那么只能被赋值一次。
格式如下:
1. 局部变量–基本类型:
基本类型的局部变量,被final修饰后,只能赋值一次,不能再更改。代码如下:
public class FinalDemo1 {
public static void main(String[] args) {
// 声明变量,使用final修饰
final int a;
// 第一次赋值
a = 10;
// 第二次赋值
a = 20; // 报错,不可重新赋值
// 声明变量,直接赋值,使用final修饰
final int b = 10;
// 第二次赋值
b = 20; // 报错,不可重新赋值
}
}
需要注意的是每次只能赋值一次
2. 局部变量–引用类型:
引用类型的局部变量,被final修饰后,只能指向一个对象,地址不能再更改。但是不影响对象内部的成员变量值的修改,代码如下:
public class FinalDemo2 {
public static void main(String[] args) {
// 创建 Person 对象
final Person p = new Person();
// 创建 另一个 Person对象
p = new Person(); // 报错,指向了新的对象,地址值改变。
// 修改对象成员变量的值,可以修改
p.name("张三");
}
}
3. 成员变量
成员变量涉及到初始化的问题,初始化方式有两种,只能二选一,如下:
- 显示初始化(在定义成员变量的时候立马赋值)
public class Student {
final int num = 10;
}
- 构造方法初始化(在构造方法中赋值一次)
public class Student {
final int num = 10;
final int num2;
public Student() {
this.num2 = 20;
// this.num2 = 20;
}
}
被final修饰的常量名称,一般都有书写规范,所有字母都大写。