java中final关键字的施用及static final 和final的区别

java中final关键字的使用及static final 和final的区别
java中final关键字可以用在类成员(是不是所谓的域),类的方法及类中。

一、final用在域中表示:

1,一个永不改变的编译时常量。

2,一个在运行时被初始化的值,而你不希望它被改变。

static 关键字可以和final关键字结合使用,static强调只有一份,不管类被初始化多少次,static修饰的成员只初始化一次。final表示常量,不可改变。如下面的实例:

view plain copy to clipboard print ?
//file FinalData.java  
import  java.util.*; 
class  Value{ 
    int  i; 
    public  Value( int  i){ this .i=i;} 
}//end of class Value  
public   class  FinalData{ 
    private   static  Random rand =  new  Random( 47 ); 
    private  String id; 
    public  FinalData(String id){ this .id=id;} 
    private   final   int  valueOne =  9 ; 
    private   static   final   int  VALUE_TWO =  99 ; 
    public   static   final   int  VALUE_THREE =  39 ; 
     
    private   int  i3=rand.nextInt( 20 ); 
    private   final   int  i4=rand.nextInt( 20 ); 
    static   int  INT_5=rand.nextInt( 20 ); 
    static   final   int  INT_6= rand.nextInt( 20 ); 
     
    private  Value v1=  new  Value( 11 ); 
    private   final  Value v2=  new  Value( 22 ); 
    private   static   final  Value VAL_3=  new  Value( 33 ); 
     
    private   final   int  [] a ={ 1 , 2 , 3 , 4 , 5 , 6 }; 
     
    public  String toString(){ 
        return  id+ " : " + " i3 = " +i3+ ", i4 = " +i4+ " , INT_5 = " +INT_5+ " , INT_6 = "  +INT_6; 
    }//end of toString  
     
    public   static   void  main(String [] args){ 
        FinalData fd1 = new  FinalData( "fd1" ); 
        //fd1.valueOne++;//Error, can not change the final value  
        //fd1.valueOne=15;//Error, can not change the final value  
        fd1.v2.i++; 
        fd1.v1=new  Value( 9 ); 
        for ( int  j= 0 ;j<fd1.a.length;j++){ 
            fd1.a[j]++; 
        } 
        System.out.println(fd1); 
        System.out.println("Creating new FinalData" ); 
        FinalData fd2 = new  FinalData( "fd2" ); 
        System.out.println(fd1); 
        System.out.println(fd2); 
        System.out.println("Creating new FinalData" ); 
        FinalData fd3 = new  FinalData( "fd3" ); 
        System.out.println(fd1); 
        System.out.println(fd2); 
        System.out.println(fd3); 
    }//end of main  
}//end of class FinalData  
输出结果为:

fd1 : i3 = 13, i4 = 1 , INT_5 = 18 , INT_6 = 15
Creating new FinalData
fd1 : i3 = 13, i4 = 1 , INT_5 = 18 , INT_6 = 15
fd1 : i3 = 1, i4 = 9 , INT_5 = 18 , INT_6 = 15
Creating new FinalData
fd1 : i3 = 13, i4 = 1 , INT_5 = 18 , INT_6 = 15
fd1 : i3 = 1, i4 = 9 , INT_5 = 18 , INT_6 = 15
fd1 : i3 = 8, i4 = 0 , INT_5 = 18 , INT_6 = 15

从结果很容易看出,只要类被初始化final的成员也随着被初始化,如:i3,i4。而static 类型的成员却不一样,不管是否是final的,都只初始化一次,如 INT_5,INT_6。

二、final用在方法中

final用在方法中,主要有一个原因:锁定方法,以防止任何继承类修改它的含义。

final用在方法修饰中,还有一个次要原因是,在java较早版本中,可提高效率,但是最近的java版本中(Java se5/6),已经不再使用final方法来进行方法优化了。

所以只有在想要明确禁止方法被覆盖时,才将方法设置为final的。

三、类定义使用final(final类)

当将某个类整体定义为final时,就表明该类不可被继承。

final类的域可以根据个人的意愿选择是不是final的(可以添加或者不添加final在成员定义前)。不论类是否被定义为final,相同的 规则都适用于定义为final的域。然而,由于final类禁止继承,所以final类中的所有方法都隐式指定为final的了。