final
关键字
final具有“不可改变”的含义,它可以修饰非抽象类、非抽象成员方法和变量
- 用final修饰的类不能被继承,没有子类
- 用final修饰的方法不能被子类的方法重写或隐藏
- 父类中用private修饰的方法不能被子类的方法重写,因此private类型的方法默认是final类型的
- 用final修饰的变量表示常量,只能被赋值一次
final
类
继承的弱点是打破了封装,子类能够访问父类的实现细节,而且能以方法重写的方式改变实现细节,为克服这一弱点,在以下几种情况下可考虑把类设计为final类型,使它不能被继承
- 不是专门为继承而设计的类,类本身的方法之间有复杂的调用关系,若随意创建它的子类,子类有可能错误地修改父类实现细节
- 出于安全原因,类的实现细节不允许有任何改动
- 在创建对象模型时,确信这个类不会再被扩展,例如java.lang.String类就是final类
final
方法
类中声明为final类型的方法,假如父类要保留某些方法,使它们不能被子类继承则可以声明为final
方法
final
变量
用final
关键字修饰的变量,其实是将它定义为一个符号常量
final
修饰符可以修饰静态变量、实例变量和局部变量,分别表示静态常量、实例常量和局部常量- 接口中定义的变量默认为全局常量,使用
public static final
修饰 final
成员变量应该显式初始化,否则会导致编译错误- 对于
final
类型的实例变量可以先声明而不必立即赋值,这又称为空白final
,可以在构造方法或对象的初始化块中对它赋值 - 对于
final
类型的静态变量,可以在定义时进行初始化,也可以在静态初始化块中进行初始化,若没有显式初始化,系统会自动初始化为默认值 final
类型变量只能被赋值一次,即使两次赋的值相同也不行
package inter;
public class FinalTest {
final int x = 10;
// final静态变量
public static final int x2 = 100;
// 未赋初值的final变量
private int x3;
// final方法
public final void finalMethod() {
System.out.println("final方法不能被重写");
}
// final静态方法
public static final void display() {
System.out.println("final静态方法:"+FinalTest.x2);
}
public FinalTest(int x) {
// final变量未赋初值,必须在构造方法中赋值
this.x3 = x;
System.out.println("x3初值:"+this.x);
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
System.out.println(FinalTest.x2);
// final变量不能修改
// FinalTest.x2 = 20;
FinalTest.display();
FinalTest p = new FinalTest(1000);
p.finalMethod();
}
}
/*
100
final静态方法:100
x3初值:10
final方法不能被重写
*/