JAVA允许生成未赋值的final域,但是必须在域的定义处或者每个构造器中对final域进行赋值(有多少个构造器就必须赋值几次),确保在使用前被初始化。采用这种方式,可以使得final运用得更加灵活,在同一个类中,根据不同的对象赋予不同的值,却又保持不可改变的特性。
代码如下:
public class javaBlankFinal{
private final int blank;
public javaBlankFinal(){
blank = 2011;
}
public javaBlankFinal(int temp){
blank = 2012;
}
public javaBlankFinal(String temp){
blank = 2014;
}
public static void main(String args[]){
new javaBlankFinal();
}
}
使用final方法有两方面原因:一是将方法锁定,防止方法被覆盖,确保在继承中方法行为保持不变;二是将方法调用转为内联调用(inlining),以减少方法调用的开销。但是,在最近的版本中,JVM可以自行进行优化,因此无需使用final方法来处理效率问题。
关于final方法,还有一点需要注意,类中所有的private方法都隐式地指定为final方法(也可以为其加上final修饰,但没有意义)。当你试图覆盖一个private方法,编译器并没有报错,但是,实际上你并没有覆盖该方法,只是生成了一个新方法。因为private方法是无法被外部类所访问的,当然就无法覆盖到它了。
使用@Override注解可以防止上述问题。如程序所示:
代码如下:
class finalFunction{
private void finalFunctionA(){
System.out.println("finalFunctionA");
}
private final void finalFunctionB(){
System.out.println("finalFunctionB");
}
final void finalFunctionC(){
System.out.println("finalFunctionC");
}
void functionD(){}
}
class overrideFinalFunction extends finalFunction{
//@Override 添加@Override注解可以识别是否是override
public void finalFunctionA(){
System.out.println("override finalFunctionA");
}
public final void finalFunctionB(){
System.out.println("override finalFunctionB");
}
//final void finalFunctionC(){} //Cannot override the final method from finalFunction
@Override
void functionD(){} //真正的override方法
}
public class javaFinalFunction extends finalFunction{
public static void main(String args[]){
finalFunction ff = new finalFunction();
//ff.finalFunctionA(); //无法调用private方法
//ff.finalFunctionB();
overrideFinalFunction off = new overrideFinalFunction();
off.finalFunctionA(); //public方法
off.finalFunctionB();
}
}
使用final类一般是出于设计原因,不允许该类被继承。这样可以保证类的行为不会改变,或许还能避免一些安全危机。Final类中所有的方法都隐式指定为final方法,因此无法被覆盖(因为final类禁止继承,也就无法覆盖其类中的方法)。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止覆盖length()等方法。
对于final域来说,即使将一个类声明为final,类中的域不会自动成为final域。
代码如下:
final class finalClass{
int testA = 2011;
}
//class extendFinalClassextends finalClass{} //can not extendthe final class finalClass
public class javaFinalClass{
public static void main(String args[]){
finalClass fc = new finalClass();
System.out.println(fc.testA);
fc.testA = 2012;
System.out.println(fc.testA);
}
}