一、final 关键字
1、概述
子类继承父类后,可以改写父类内容,如方法重写。但是我们却不能随意的去继承 API 中提供的类,然后改写其内容。
这是因为 Java 提供了 final 关键字,用于修饰不可改变内容。
2、作用范围
在Java中声明类、 变量和方法时, 可使用关键字 final 来修饰,表示“最终的” 。
(1)final 标记的类不能被继承。
被 final 修饰的类,不能被继承。提高安全性, 提高程序的可读性。
可以用来修饰 外部类 和 内部类。
(2)final 标记的方法不能被子类重写。
final 可以用来修饰静态方法 和 非静态方法,不能被重写,可以被继承。
(3)final 标记的变量(成员变量或局部变量)即称为常量。
final 可以用来修饰变量(成员变量(类变量、实例变量)、局部变量)
二、修饰类
1、使用方式
定义格式:
final class 类名 {
// 方法体
}
像 Java 中的 String,Math,System,Scanner 这些类都是声明为 final 类,目的就是供使用,而不让随意改变其内容。
2、注意点
final 修饰的类一定不能被继承。
三、修饰方法
1、使用方式
定义格式:
其他修饰符 final 返回值类型 方法名(参数列表){
//方法体
}
2、注意点
(1)如果重写 final 修饰的方法,编译会报错;
(2)对于类、方法来说,abstract关键字和final关键字不能同时使用,因为矛盾。
四、修饰变量
1、修饰成员变量
final修饰属性:可以考虑赋值的位置有:显式初始化、代码块中初始化、构造器中初始化。
① 显示初始化
1 public class User {
2 final String USERNAME = "张三";
3 private int age;
4 }
② 代码块中初始化
1 public class User {
2 final String USERNAME;
3 {
4 USERNAME = "张三";
5 }
6 private int age;
7 }
③ 构造器中初始化
1 public class User {
2 final String USERNAME ;
3 private int age;
4 public User(String username, int age) {
5 this.USERNAME = username;
6 this.age = age;
7 }
8 }
注意:
(1)对于final的成员变量,要么使用直接赋值,要么通过代码块或者构造方法赋值。三者选其一。
(2)必须保证类当中所有重载的构造方法,都最终会对 final 的成员变量进行赋值。
(3)static final 用来修饰属性:全局常量
2、修饰局部变量
(1)修饰局部变量——基本数据类型
基本类型的局部变量,被 final 修饰后,只能赋值一次,不能再更改。
Demo:
1 public class FinalDemo1 {
2 public static void main(String[] args) {
3 // 声明变量,使用final修饰
4 final int a;
5 // 第一次赋值
6 a = 10;
7 // 第二次赋值
8 a = 20; // 报错,不可重新赋值
9 // 声明变量,直接赋值,使用final修饰
10 final int b = 10;
11 // 第二次赋值
12 b = 20; // 报错,不可重新赋值
13 }
14 }
(2)修饰局部变量——引用类型
引用类型的局部变量,被 final 修饰后,只能指向一个对象,地址不能再更改。但是不影响对象内部的成员变量值的修改。
Demo:
1 public class FinalDemo2 {
2 public static void main(String[] args) {
3 // 创建 User 对象
4 final User u = new User();
5 // 创建 另一个 User对象
6 u = new User(); // 报错,指向了新的对象,地址值改变。
7 // 调用setName方法
8 u.setName("张三"); // 可以修改
9 }
10 }
注意:尤其是使用final修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参。一旦赋值以后,就只能在方法体内使用此形参,但不能进行重新赋值。
Demo:
1 public class Something {
2 public static void main(String[] args) {
3 Other o = new Other();
4 new Something().addOne(o);
5 }
6 public void addOne(final Other o) {
7 // o = new Other(); 错误的 形参只能指向原来的对象,不能指向新的对象
8 o.i++;
9 }
10 }
11 class Other {
12 public int i;
13 }
3、注意
(1)被 final 修饰的常量名称,一般都有书写规范,所有字母都大写。
(2)final 用来修饰变量:此时的"变量"就称为是一个常量。