final在java中的用法
四种用法
- 修饰一个类
- 修饰一个方法
- 修饰一个局部变量
- 修饰一个成员变量
1.修饰一个类
public final class 类名称{
...
}
2.修饰一个成员变量
class Person{
// final int height; 报错,必须赋初值
// final类型的成员变量必须赋初值
// 方式一:声明的时候直接赋值
final int height=120;
// 方式二:构造器赋值
final int height;
Person(int height){
this.height=height;
}
}
作用:被final 修饰的成员变量一旦被赋值就不可以被改变
对于基本数据类型而言,变量的值不可变
对于引用类型,变量的地址不可变
说明:
1.被声明为final的成员变量必须被赋初值,否则 报错
2.有两种对成员变量进行赋初值的方式,且这两种方式只能存在一个;
- 方式1:在声明时直接赋值
- 方式2:在有参构造器中赋值,
3.修饰一个方法
修饰符 final 返回值类型 方法名称(参数列表){
方法体
}
作用:该方法不能被重写
4.修饰一个局部变量
void setAge (int a) {
final int dadAge;// [1]
// dadAge = 1;// [2]
final int age = a;
// age += 1; // [3] 报错
System.out.println(age);
// System.out.println(dadAge); // [4] 报错
}
当final关键字修饰一个局部变量时,该变量同样不可变。
注意:
[1] 可以不赋初值,编译器不会报错
[2] 也可以赋初值
[3] 报错,一旦被赋初值,便不可以被修改
[4] 报错,未赋初值不可直接被使用
说明:局部变量不可变意味着在当前执行该方法时,被final修饰的局部变量一旦被赋初值后便不可改变,但是方法结束后,局部变量就被销毁了
总结就是:
(1) 作用于类时,类不可被继承;
(2)作用于方法时,方法不可被重写;
(3) 作用于变量时,在该变量的生命周期内,一旦被赋初值后便不可被修改。
推论:
(1)abstract与final是天然的矛盾,因为抽象类就是需要被继承的,抽象方法就是需要被重写的,所以两个关键词不可同时使用;
(2)private与final关键字同时修饰方法时,IDEA会提示移除final关键字,因为private的可见性是当前类,所以天然就不可被子类重写,所以在修饰方法的层面上,private包含了final关键字的作用。
今天是持续写作的第 17 / 200 天。可以点赞、评论、收藏啦。