final修饰符
final关键字可用于修饰变量,方法和类,用于表示它修饰的变量,方法和类不可改变。
- final修饰变量
final修饰变量时,表示该变量一旦获得初始值就不可以被改变。final即可以修饰成员变量,也可以修饰局部变量。
- final成员变量必须由程序员显式指定初始值。因为final修饰成员变量,一旦有了初始值,就不能被重新赋值,而在没有指定初始值时,也没有在初始化,构造器中为成员变量指定初始值,那么这些成员变量的值将是系统默认分配的,此时,这些成员变量也就失去了意义。
- 实例变量不能在静态初始化块中指定初始值。因为静态初始化块是静态成员,不可访问实例变量(非静态成员)。
- final修饰方法
- final修饰的方法不可以被重写,例如在Object类中的getClass()方法,若重写final方法,会出现编译错误
public class FinalTest{
public final void test(){
}
}
class Sub extends FinalTest{
//重写final方法,出现编译错误
public void test(){
}
}
2. 对于一个private方法,因为其只可以对当前类可见,子类无法访问该方法,子类也就无法重写该方法。但是,如果子类中定义一个与父类private方法有相同方法名,相同参数列表,相同返回类型的方法,不是方法重写,只是重新定义了一个新方法,不会出现编译错误,(有final修饰的private方法,导致子类不能直接继承此方法,此时,在子类中定义相同方法名,相同参数列表的方法,不会与final修饰方法产生矛盾,相当于一个新方法)例:
public class PrivateFinalTest{
private final void test(){
}
}
class Sub extends PrivateFinalTest{
//重写final方法,出现编译错误
public void test(){
}
}
- final修饰类
final修饰的类不能被继承(不能有子类),例如:java.lang.Math类就是一个final类,不可以有子类。
public final class FinalClass{
}
//以下类定义,出现编译错误
class Sub extends FinalClass{
}