使用final

虽然方法重写和继承功能强大.用途广泛,但有时也需要阻止他们.例如,可能有一个封装了某些硬件设备控制的类.而且,这个类可能为用户提供了初始化设备,使用私有信息的能力.这种情况下,你并不希望类的用户重写初始化方法.无论处于何种原因,在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可以防止他被多次赋值.