虽然方法重写和继承功能强大.用途广泛,但有时也需要阻止他们.例如,可能有一个封装了某些硬件设备控制的类.而且,这个类可能为用户提供了初始化设备,使用私有信息的能力.这种情况下,你并不希望类的用户重写初始化方法.无论处于何种原因,在Java中,如果要防止方法重写或类的继承,只需使用关键字final即可.
1.使用final防止重写
为防止方法被重写,需要在方法声明的开始处把final指定为修饰符.被声明为final的方法不能被重写.下面的代码段演示了final的用法:
class A { final void meth(){} } Class B extends A { void meth(){} //error,can't override }
因为把meth()声明为final,所以不能在B中重写他,如果重写了他,就会导致编译时错误.
2.使用final防止继承
通过在类的声明前添加final可以防止类被继承.把类声明为final也就把他所有的方法都隐式声明为final.把 一个类即声明为abstract,又声明为final是非法的,因为抽象类自身是不完整的,要依赖于其子类来提供完整的是实现方式:
下面是一个final类的示例:
final class A{} class B extends A{} //error,can't subclass A
正如注释提示的那样,B继承A是非法的,因为已经把A声明为final类了.
3.对数据成员使用final
除了刚才使用的final,final还可以应用于成员变量来创建已知命名常量.如果在类变量名前使用final,他的值在程序的生命期内就不能改变.当然,为变量赋值是允许的.
public class test2 { // @param args public static void main(String args[]) { ErrorMsg err = new ErrorMsg(); System.out.println(err.getErrorMsg(1)); } } class ErrorMsg { final int OUTERR = 1; final int INERR = 2; String msgs[] = { "output error", "input error" }; String getErrorMsg(int i) { if(i >= 0 && i < msgs.length) return msgs[i]; else return "Invaild Error Code"; } }
问:final成员变量可以声明为static吗?final可以用到方法的形参和局部变量上吗?
答:两个问题的答案都是可以,将final成员变量声明为static允许通过类名而不是对象来引用常量.例如,如果将ErrorMsg中的常量修改为static,那么main()中的println()语句可以如下所示:
System.out.println(ErrorMsg.INERR);
将形参声明为final可以防止在方法内部修改他.将局部变量声明为final可以防止他被多次赋值.