JAVA中的final关键字

来源:互联网 发布:三国之数据辅助小说 编辑:程序博客网 时间:2024/04/29 07:41

           一、final 数据


         向编译器告知一块数据是恒定不变的。如:

1)永不改变的编译时常量;

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

一个既是static又是final的域只占据一段不能改变的存储空间,一般用大写表示,并使用下划线分隔各个单词。


        数据类型:

1)基本数据类型(int,float,char,double,boolean等):final使数值恒定不变;

2)对象引用(string,array,class等):final使引用恒定不变,但其值可以改变。


       空白final

空白final是指被声明为final但又未给定初值的域。空白final在关键字final的使用上提供了更大的灵活性,为此,一个类中的final域就可以做到根据对象而有所不同,却又保持其恒定不变的特性。但无论如何,编译器都确保空白final在使用前必须被初始化。

final的赋值方式有两种:

1)在域的定义处对final进行赋值,如:private final int i = 0;

2)在构造器中用表达式对final进行赋值,如:private final int j;public ClassA(){ j = 1;}

对于空白final的赋值,我们使用第二种方式。


        final 参数

在参数列表中以声明的方式将参数指明为final,意味着你无法在方法中更改参数引用所指向的对象。你可以读参数,但却无法修改参数,这一特性主要用来向匿名内部类传递数据。


        二、final 方法


        使用final方法的原因:

1)把方法锁定,以防任何继承类修改它的含义。这是出于设计的考虑:想要确保在继承中使方法行为保持不变,并且不会被覆盖。

2)早期使用final方法的第二个原因是效率。早期的JAVA实现中,final方法同意编译器将针对该方法的所有调用都转为内嵌调用,即以方法体中的实际代码的副本来替代方法调用,从而省去方法调用的时间开销。而非final方法的调用过程一般为:将参数压入栈,跳至方法代码处并执行,然后跳回并清理栈中的参数,处理返回值。

      但是,当你的final方法的代码很长时,用final可能适得其反,因为经过编译器内嵌之后代码长度大大增加,于是就增加了JVM解释字节码的时间。在最近的JAVA版本中,虚拟机可以探测到这些情况,于是效率问题会让编译器和JVM来处理,而不再使用final方法来提高效率。final方法的使用原因就只剩下第一条。


       final与private关键字

类中所有的private方法都隐式地指定为是final的。由于无法取用private方法,所以也就无法覆盖它。


       三、final 类


       当将某个类的整体定义为final时,就表明了你不打算继承该类,而且也不允许别人这么做。

原创粉丝点击