final就是拒绝修改,防止世界被熊孩子破坏,维护世界和平! 继《你不可不知的final(2)-修饰局部变量(失手率极高的一道面试题)》后,今天我们再看一道失手率比较高的面试题,final的初始化时机。
我们先看这一段代码:
class Init{
int num = 10;
public Init(){
System.out.println("Init()-1:" + num);
num = 100;
System.out.println("Init()-2:" + num);
}
}
Init i = new Init();
System.out.println("new Init():" + i.num);//100:成员变量初始化,构造方法
请说出输出结果:
Init()-1:10
Init()-2:100
new Init():100
先成员变量初始化,在加载构造方法,十分Easy。
接下来我们引入final,修改代码引入numFinal:
class Init{
int num = 10;
final int numFinal = 20;
public Init(){
System.out.println("Init()-1:" + num);
num = 100;
System.out.println("Init()-2:" + num);
numFinal = 200;
}
}
不用猜,直接报错:The final field Init.numFinal cannot be assigned
我们今天的第一条结论:
被final修饰的变量只能初始化一次。
class Init{
int num = 10;
final int numFinal = 20;
final int numFinal2;
public Init(){
System.out.println("Init()-1:" + num);
num = 100;
System.out.println("Init()-2:" + num);
//numFinal = 200;
//The final field Init.numFinal cannot be assigned
}
}
大家猜一猜结果?
不用猜,直接报错:The blank final field numFina2 may not have been initialized
因此我们在构造函数中添加代码:numFinal2 = 300;由此,得出我们的第二条结论:
final的赋值时机:
1.定义的时候。(推荐)
2.构造方法完毕前(非静态常量)。