说透final
在java中final是一个多面手,不同的情景有不同的作用,我们可以从两个方面分析它
1、用做变量声名时
用做变量声名时根据使用的不同情景可以把它解释为,const与readonly;
const的情况
final int a = 3;
这种情况属于编译时就已确定,以后不能改变这个常量的值
不能由于某样东西的属性是final,就认定它的值能在编译时期知道:如:
final int a = (int)(Math.random()*20)
readonly的情况
public class Test{
final int a;
final People people;
public Test(){
a = 3;
people = new People;
people.name = "zhoushangwu";
}
}
这种情况相当于readonly,java中叫空白值,空白final 都必须在实际使用前得到正确的初始化,之后将不能被改变。
注:
1.引用类型的final值,只是说对引用来说是一个常值,不能重新将引用指向新的对象。但是它所指向的对象的属性是可以改变的,如:people.name="zhoushangwu"
2.final的static基本数据类型的名称按命名规则应全为大写,单词中间用下划线分隔.
3.引用类型的final,虽然要求实际使用前得到正确的初始化,但是可以把它初化为null值
这种情况属于参数常量,方法中不能再对参数常量值做修改
public class Test{
public void print(final String msg){
//msg = "abc"; 这句代码通不过
}
}
2、用做方法定义前
public final void draw(){
//这个方法不能在子类中被重写覆盖
}
用做方法定义前主要出于两方面的目的:一方面是设计上的,不希望相关方法在子类中被重写;另一方面,出于优化性能,final的方法与其它普通方法省去一些步骤(方法调用时的压栈,调用完后的出栈等出于保护现场的操作),因为final方法是在编译时就直接把方法的复本直接复制到所有调用它的地方。
注:java中的private方法编辑时默认会加上final进行处理,所以当给private方法前加final关键字时,会出现编译不过的现象。
浙公网安备 33010602011771号