分享

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

 OneDayDayUp 2014-07-07

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

一、final用在域中表示:

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

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

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

  1. //file FinalData.java   
  2. import  java.util.*;  
  3. class  Value{  
  4.     int  i;  
  5.     public  Value( int  i){ this .i=i;}  
  6. }//end of class Value   
  7. public   class  FinalData{  
  8.     private   static  Random rand =  new  Random( 47 );  
  9.     private  String id;  
  10.     public  FinalData(String id){ this .id=id;}  
  11.     private   final   int  valueOne =  9 ;  
  12.     private   static   final   int  VALUE_TWO =  99 ;  
  13.     public   static   final   int  VALUE_THREE =  39 ;  
  14.       
  15.     private   int  i3=rand.nextInt( 20 );  
  16.     private   final   int  i4=rand.nextInt( 20 );  
  17.     static   int  INT_5=rand.nextInt( 20 );  
  18.     static   final   int  INT_6= rand.nextInt( 20 );  
  19.       
  20.     private  Value v1=  new  Value( 11 );  
  21.     private   final  Value v2=  new  Value( 22 );  
  22.     private   static   final  Value VAL_3=  new  Value( 33 );  
  23.       
  24.     private   final   int  [] a ={ 1 , 2 , 3 , 4 , 5 , 6 };  
  25.       
  26.     public  String toString(){  
  27.         return  id+ " : " + " i3 = " +i3+ ", i4 = " +i4+ " , INT_5 = " +INT_5+ " , INT_6 = "  +INT_6;  
  28.     }//end of toString   
  29.       
  30.     public   static   void  main(String [] args){  
  31.         FinalData fd1 = new  FinalData( "fd1" );  
  32.         //fd1.valueOne++;//Error, can not change the final value   
  33.         //fd1.valueOne=15;//Error, can not change the final value   
  34.         fd1.v2.i++;  
  35.         fd1.v1=new  Value( 9 );  
  36.         for ( int  j= 0 ;j<fd1.a.length;j++){  
  37.             fd1.a[j]++;  
  38.         }  
  39.         System.out.println(fd1);  
  40.         System.out.println("Creating new FinalData" );  
  41.         FinalData fd2 = new  FinalData( "fd2" );  
  42.         System.out.println(fd1);  
  43.         System.out.println(fd2);  
  44.         System.out.println("Creating new FinalData" );  
  45.         FinalData fd3 = new  FinalData( "fd3" );  
  46.         System.out.println(fd1);  
  47.         System.out.println(fd2);  
  48.         System.out.println(fd3);  
  49.     }//end of main   
  50. }//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的了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多