在java中final关键字指的是“这是无法改变的”。
final关键字可以用来修饰数据、方法、类。
1.final修饰变量
(1)final修饰基本数据类型
final修饰基本数据类型可以使基本数据类型的值恒久不变。
(2)final修饰引用数据类型
final修饰引用数据类型可以使引用数据类型的引用恒久不变。
也就是说这个引用的内存地址是不变的,但是指向的那个对象是可以改变的。
(3)空白final。
final可以在成员变量中生成一个空白final。
空白final是指被声明为fianl但是为给定初值的域。无论什么情况,编译器都确保空白final在使用前必须被初始化。必须在域的定义处或者每个构造器中用表达式对final进行赋值,这正是final域在使用前总是被初始化的原因所在。
(4)final参数。
final允许参数列表中以声明的方式将参数指明为final。这意味着你将在方法中无法改变参数引用所指向的对象。
下例中,g和f对比发现:f出现错误,但是g却可以运行。class Gizmo{
public void spin(){}
}
public class FinalArguments {
void with(final Gizmo g){
//! g=new Gizmo();
}
void without(Gizmo g){
g=new Gizmo();
g.spin();
}
/*
void f(final int i){
i++;
}
*/
int g(final int i){
return i+1;
}
public static void main(String[]args) {
FinalArguments bf = new FinalArguments();
bf.without(null);
bf.with(null);
int g = bf.g(3);
System.out.println(g);
}
}
使用final修饰形参列表:只能调用修饰的方法或基本数据类型,但是无法对其进行修改。
2.final修饰方法
使用final方法的原因:把方法锁定,以防任何修饰类修改它的含义。
使用final修饰的方法不能被@Override。(被private修饰的类也不能被重写)
3.final修饰类
(1) 当某个类被定义成final时,就表明了这个类不能被继承。
(2)被final修饰的类中的方法隐式的被指定为final,因为无法覆盖它们。
(3)当某一个类被修饰成final时, 可以给此类中的方法添加final修饰词,但这不会增添任何意义。