java中final关键字可以用在类成员(是不是所谓的域),类的方法及类中。
一、final用在域中表示:
1,一个永不改变的编译时常量。
2,一个在运行时被初始化的值,而你不希望它被改变。
static 关键字可以和final关键字结合使用,static强调只有一份,不管类被初始化多少次,static修饰的成员只初始化一次。final表示常量,不可改变。如下面的实例:
- //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的了。
|