您的位置:首页 > 职场人生

你不可不知的final(3)-初始化时机(失手率比较高的一道面试题)

2016-10-17 19:49 225 查看
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修饰的变量只能初始化一次。

我们继续改代码,引入numFinal2:

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.构造方法完毕前(非静态常量)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: