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