final关键字与类
- 用final修饰的类为最终类,意味着该类无法被继承
- 由于该类无法被继承,故其方法不会被重写,也不会出现多态
- 因此静态绑定效率较高
例如:
final class Person{
}
// class Student extends Person{ //因为Person类被final修饰,无法被继承,故错误
//
// }
final关键字与方法
- 用final修饰的方法无法被重写
- 该方法不会出现多态
- 因此该方法加载至该类的静态绑定区
例如:
class Person{
public final void say(){
System.out.println("我是人类");
}
}
class Student extends Person{
// public void say(){
// System.out.println("我不是人类"); //由于父类的say方法被final修饰,无法被重写,故错误
// }
}
final关键字与数据类型
- 基本数据类型被final修饰后其值无法再更改
- 引用数据类型被final修饰后,锁定的值为该对象在堆中的地址
- 因此该对象的属性可以更改
- 但是不可以为变量更改对象,因为这意味着更换它所指向的地址
例如:
class Hello{
final int num = 100;
final Person person = new Person();
num = 200; //num由final修饰,其值为100且无法再更改,错误
person.age = 18; //这里更改的是person所指向的age的值,并没有更改person的值(地址),正确
}
class Person{
public int age;
}
final关键字与成员变量和局部变量
- 不管是成员变量或是局部变量都只能对其赋值一次
- 成员变量可以在代码块中赋值
- 成员变量还可以在构造器中对其赋值,但必须保证每个构造器都要有赋值语句
- 局部变量可以在定义时就对其赋值
- 局部变量还可以在声明后的任一语句对其赋值
例如:
class Hello{
public int num0;
public final int num1;
public final int num2;
{
num1 = 100; //在代码块中赋值
}
public Hello(){
this.num2 = 200;
}
public Hello(int num0){
this.num0 = num0;
this.num2 = 200;
}
//可以在构造器中赋值 但必须每个构造器都有赋值语句
public void func(){
final int a = 100; //可以在声明时就对其赋值
final int b;
b = 200;
//也可以在声明后的语句对其赋值(可以不是声明后的第一句)
//但无论是哪一种方法都只能赋值一次,否则错误
}
}
final关键字与参数
方法中的参数同样可以用final来修饰,并且不用考虑其初始化的问题,因为在调用该方法时肯定会传参进去,但需要注意的是在方法体内不能再对该参数的值进行修改
例如:
class Hello{
public static void main(String[] args){
}
public static void func(final int num){
// num = 100; //因为final修饰的变量只能赋值一次且调用时已经赋值了,故错误
System.out.println(num);
}
}
final关键字与静态常量
- 在类中用static修饰的常量同样可以用final修饰
- 一般在声明时就为其赋值
- 其变量名需要全部大写,不同单词间用下划线隔开
例如:
class Hello{
public static final int LAST_NUMBER = 100;
}