全面解析java final关键字
根据上下文环境,Java的关键字final的含义有些微的不同,但通常它指的是“这是不能被改变的”。防止改变有两个原因:设计或效率。因为这两个原因相差很远,所以有可能误用关键字final。
以下几节讨论了可能使用final的三个地方:数据、方法和类。
1)final数据
对于编译时常量这种情况,编译器可以把常量带入计算中,可以减少了一些运行时的负担。在Java中,这类常量必须是基本类型,而且用关键字final修饰。你必须在定义常量的时候进行赋值。
带有恒定初始值的finalstatic基本变量(即编译时常量)命名全部使用大写,单词之间用下划线分隔。
一个被static和final同时修饰的属性只会占用一段不能改变的存储空间。
当用final修饰对象引用而非基本类型时,
- 对于基本类型,final使数值恒定不变。
- 对于对象引用,final使引用恒定不变。
一旦引用被初始化指向了某个对象,它就不能改为指向其他对象。但是,对象本身是可以修改的,Java没有提供将任意对象设为常量的方法。(你可以自己编写类达到使对象恒定不变的效果)这一限制同样适用数组,数组也是对象。
示例:
importjava.util.*;
classValue{
inti;
Value(inti){
this.i=i;
}
}
/**
*@authorLimh
*/
publicclassFinalData{
privatestaticRandomrand=newRandom(47);
privateStringid;
publicFinalData(Stringid){
this.id=id;
}
privatefinalintvalueOne=9;
privatestaticfinalintVALUE_TWO=99;
publicstaticfinalintVALUE_THREE=39;
privatefinalinti4=rand.nextInt(20);
staticfinalintINT_5=rand.nextInt(20);
privateValuev1=newValue(11);
privatefinalValuev2=newValue(22);
privatestaticfinalValueVAL_3=newValue(33);
privatefinalint[]a={1,2,3,4,5,6};
@Override
publicStringtoString(){
returnid+":"+"i4="+i4+",INT_5="+INT_5;
}
publicstaticvoidmain(String[]args){
FinalDatafd1=newFinalData("fd1");
//v2=newValue(22);
fd1.v2.i++;
fd1.v1=newValue(9);
//a.length=6
for(inti=0;i
输出:
fd1:i4=15,INT_5=18
CreatingnewFinalData
fd1:i4=15,INT_5=18
fd2:i4=13,INT_5=18
因为第一个变量和第二个变量都是带有编译时值的final基本类型,它们都可用作编译时常量,没有多大区别。第三个变量是一种更加典型的常量定义的方式:public意味着可以在包外访问,static强调只有一个,final说明是一个常量。
正如你在main()中所见,v2是final的并不意味着你不能修改它的值。因为它是引用,所以只是说明它不能指向一个新的对象。
2)空白final
空白final指的是没有初始化值的final属性。
编译器确保空白final在使用前必须被初始化。这样既能使一个类的每个对象的final属性值不同,也能保持它的不变性。
你必须在定义时或在每个构造器中执行final变量的赋值操作。这保证了final属性在使用前已经被初始化过。
3)final参数
在参数列表中,将参数声明为final意味着在方法中不能改变参数指向的对象或基本变量:
classGizmo{
publicvoidspin(){
}
}
/**
*@authorLimh
*/
publicclassFinalArguments{
voidwith(finalGizmog){
//-g=newGizmo();
//Illegal--gisfinal
}
voidwithout(Gizmog){
g=newGizmo();//OK--gisnotfinal
g.spin();
}
//voidf(finalinti){i++;}//Can'tchange
//Youcanonlyreadfromafinalprimitive
intg(finalinti){
returni+1;
}
publicstaticvoidmain(String[]args){
FinalArgumentsbf=newFinalArguments();
bf.without(null);
bf.with(null);
}
}
4)final方法
使用final方法的原因有两个。
给方法上锁,防止子类通过覆写改变方法。这是出于继承的考虑,确保方法的行为不会因继承而改变。
只有在为了明确禁止覆写方法时才使用final。
5)final和private
类中所有的private方法都隐式地指定为final。因为不能访问private方法,所以不能覆写它。
6)final类
当说一个类是final(final关键字在类定义之前),就意味着它不能被继承。之所以这么做,是因为类的设计就是永远不需要改动,或者是出于安全考虑不希望它有子类。
由于final类禁止继承,类中所有的方法都被隐式地指定为final,所以没有办法覆写它们。你可以在final类中的方法加上final修饰符,但不会增加任何意义。
以上就是全面解析javafinal关键字的详细内容,更多关于javafinal关键字的资料请关注毛票票其它相关文章!