从零学Java(10)——final关键字
30 December 2013
C/C++中有宏,有const关键字,那么Java有什么机制去实现这些?用的就是final关键字。final关键字的用途很多,需要注意的地方也不少。
final数据
final可以用来声明数据,更让人熟悉的说法是声明变量。比如我们想要声明一个常量。
private static final int VALUE = 10;
不仅把变量VALUE声明为final类型,同时还声明为static类型。final类型使得这个变量无法改变(或叫做常量),static类型使VALUE只占有一段不能改变的内存。final成员变量必须在声明的时候初始化,或在构造器中初始化。这里大写是一般约定。
这里还要注意,final声明的变量,只是使其引用不能改变,而其引用对象中的其他变量还是可以改变。比如:
public A {
private int i;
private final A a = new A(1);
public A(int i) { this.i = i;}
public static void main(String[] args) {
a.i++;
}
}
这里只是a不能再被别的对象引用,但其引用对象内部的成员是可以改变的。再举一个例子:
private final List l = new ArrayList();
l.add("a");
l.add("b");
//l = new Vector(); invalid
之前说过final的初始化,如果声明使不对其初始化,这时称其为空白final,这时必须在构造器中初始化。
如果在方法的参数上设置final:
public A {
void f(final int ll) {}
}
这时,这个传入的参数是只读类型的。
final方法
final声明方法的用途在于:防止任何继承类修改它,也可以提高效率。由于final方法是在编译阶段绑定(静态绑定),故效率更高。类中所有private方法都隐式的指定为final,如果类被声明为final类型,子类方法不能重写这个方法。
final类
如果类被声明为final,则这个类不能被继承(没准你的类写的已经很完美了。。。说不定是为了安全)。final类中所有成员方法都被隐式声明为final类型。
尽管final关键字能够提高效率,但大多数情况这种提高非常有限,所以,最好根据设计来决定是否使用final,而不是提高效率上。
blog comments powered by Disqus