全面解析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关键字的资料请关注毛票票其它相关文章!