Java中的final

Java中的final通常它指的是“这是无法改变的”。但对于不同的用法有不细微的区别。

final可以用在数据、类、方法、参数上。

final数据

final作用于基本类型时,final使数值恒定不变

例如:final int  i1 = 5;  此表示i1的值只能是5,不能再改变。你其要修改它的值,比如尝试 i1 = 4; 将报错。

final作用于对象引用,final使引用恒定不变。即一旦引用到一个对象,就无法把它改为指向另一个对象。然而,对象其值却是可以修改的。例如:

class Value {
	public int i;
	public Value(int i) { this.i = i; }
}

public class FinalData {
	public static void main (String[] args){
		final Value d1 = new Value(1);
		d1.i = 2; // 这是合法的,可以修改它的值
		
		// d1 = new Value(2); //不能这样做,不能再引用到其它对象
	}
}

空白final

所谓空白final是被声明为final但又不未给它定初值。

class Poppet {
	private int i;
	
	public Poppet (int ii) { this.i = ii;}
}
class BlankFinal {
	private final int i = 0;
	private final int j; // 注意这里,并没有对其进行初始化,但在每一个构造函数中必须对其进行初始化
	private final Poppet p;
	BlankFinal (){
		j = 1;
		p = new Poppet(1);
	}
	BlankFinal (int x) {
		j = x;
		p = new Poppet(x);
	}
}
此时,必须在域的定义处,或者每个构造器中用表达式对final进行赋值。同时,这也表示在方法域类,不可能有空白final

final参数

Java允许在参数列表中以声明的方式将参数指明为final。这意味着你无法在方法中更改参数引用所指向的对象。

final方法

如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
使用final方法的原因有二:
第一:把方法锁定,防止任何继承类修改它的意义和实现。
第二:高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。

final类

final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许被展现,并且确信这个类不会被扩展,那么就设计为final类。


猜你喜欢

转载自blog.csdn.net/lijing_lj928/article/details/22998689