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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值