0%

final关键字

1. 含义

final 表面意思就是不可更改的,恒量的意思。final 修饰的变量与静态变量是有所不同的,静态变量指的是只有一份存储空间,值是可以改变的,而 final 修饰的变量是不可更改的。

2. 修饰类

当用 final 修饰一个类时,表明这个类不能被继承。其中,final 类中的所有成员方法都会被隐式地指定为 final 方法,而 final 类中的成员属性则不会有隐式的 final 修饰,这也恰恰说明 final 类的成员变量是可以更改的。

3. 修饰方法

final修饰的方法表示此方法已经是“最后的、最终的”含义,亦即此方法不能被重写

注意:因为重写的前提是子类可以从父类中继承此方法,如果父类中 final 修饰的方法同时访问控制权限为private,将会导致子类中不能直接继承到此方法。因此,此时可以在子类中定义相同的方法名和参数,此时不再产生重写与final的矛盾,而是在子类中重新定义了新的方法。(类的 private 方法会隐式地被指定为 final 方法。)示例如下:

父类 Father 的具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
public class Father {

//final 修饰, 访问控制权限为 private
final private void fmethod1() {
System.out.println("father ... fmethod1");
}

public void fmethod2() {
System.out.println("father ... fmethod2");
}
}

子类 Son 的具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Son extends Father {

//与父类的私有方法 fmethod1相同
public void fmethod1() {

}
// 重载
public void fmethod1(int age) {

}
//重写
@Override
public void fmethod2() {
super.fmethod2();
}

}

4. 修饰变量

final 修饰的变量必须要初始化,赋初值后不能再重新赋值。初始化可以以三种方式:

  1. 定义时初始化;
  2. 在构造方法中初始化;
  3. 在代码块中为 final 实例变量初始化。

示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//1. 定义时初始化
final int c = 45;

//2. 构造方法中初始化
final int a;
public FinalDemo(int a) {
this.a = a;
}

//3. 代码块中初始化
final int b;
{
b = 5;
}

当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用数据类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。

5. 修饰参数

与使用 final 修饰变量相似,在方法参数列表中被 final 修饰的基本数据类型参数在方法体内是不可以被更改的,如果是引用数据类型则不可以指向其他对象。

1
2
3
4
5
6
public void change(final int i, final String str) {
//The final local variable i cannot be assigned.
//It must be blank and not using a compound assignment
//i++; 编译出错
//str = ""; 编译出错
}
------ 本文结束------