final关键字
# final关键字
在Java中声明类、变量和方法时,可使用关键字final来修饰,表示“最终的”
final
标记的类不能被继承。提高安全性,提高程序的可读性。- 例如:
String
类、System
类、StringBuffer
类
- 例如:
final
标记的方法不能被子类重写。- 比如:
Object
类中的getClass
()。native
是底层C++实现。
- 比如:
final
标记的变量(成员变量或局部变量)即称为常量。名称大写,且只能被赋值一次。final
标记的成员变量必须在声明时或在每个构造器中或代码块中显式赋值,然后才能使用。- 成员变量
- 常量可以显式初始化、代码块初始化、构造器初始化
- 简单赋值就在显式初始化时赋值
- 可能抛异常或者调用方法,就在代码块初始化赋值
- 每个对象都可能不一样,构造器中初始化时赋值
- 常量可以显式初始化、代码块初始化、构造器初始化
- final修饰方法体内的局部变量,即成为常量。
- 尤其是使用final修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参,一旦赋值以后,只能获取,不能修改。
- 成员变量
static final
:全局常量
# final修饰类
final
标记的类不能被继承。提高安全性,提高程序的可读性。
final class A{
}
//错误,不能继承
class B extends A{
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# final修饰方法
final
标记的方法不能被子类重写。
class A{
public final void print(){
System.out.println("A");
}
}
class B extends A{
//错误,不能被重写
public final void print(){
System.out.println("B");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# final修饰变量——常量
final
标记的变量(成员变量或局部变量)即称为常量。名称大写,且只能被赋值一次。
class A{
private final String INFO = "info....";
public void print(){
//错误,常量在初始化后不能修改
INFO = "test";
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
常量名要大写,内容不可修改。
# static final
:全局常量
关键字final应用举例
publc class Student{
public static int TOTAL_NUMBER = 5;
public final ID;
public Student(){
ID = TOTAL_NUMBER++;
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
全局常量会在类加载的时候赋值一次,而ID会在每个学生对象实例化时生成。
全局常量会一直存在静态方法区,可以做到自动计算。
而ID会在学生对象实例化时赋值,不可再修改。
# 【面试题】排错
public class Something{
public int addOne(final int x){
return ++x; //编译不通过,常量只能赋值一次
//return x + 1; //编译通过
}
}
1
2
3
4
5
6
2
3
4
5
6
编译不过,常量只能赋值一次。
public class Somenthing2 {
public static void main(String[] args) {
Other o = new Other();
new Somenthing2().addOne(o);
}
public void addOne(final Other o) {
//o = new Other();
o.i++;
}
}
class Other{
public int i;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
o
不可以变,但是i
可以变。
帮我改善此页面 (opens new window)
上次更新: 2020/12/18, 12:50:58