java允许生成空白final,所谓空白final是指被声明为final但是又未给定初值的域,编译器都确保空白final在使用前必须被初始化。
因此一个类中的final域可以根据对象的不同而不同,却保持其恒定不变的特性。
java中是允许去进行定义空白final的
将其进行初始化的构造方法不写的话,将会报错,如下图所示:
但是当添加相关的构造方法之后,即可进行相关的赋值没也就不会出现错误了,因此可以得出结论,
java是允许进行空白final的定义的,但是必须在调到用的时候进行赋值操作,
final在被调用前总是被初始化的原因:
(1)在域的定义处进行初始值定义:
如:private final int i=0; //初始化final
或者直接在构造方法中对final定义的东西进行初始化操作:
如:
完整验证代码示例如下所示:
class Popet{
private int i;
Popet(int i1){
i=i1;
return;
}
}
public class Blankfinal {
private final int i=0; //初始化final
private final int j;//blank final
private final Popet p;//blank final reference
public Blankfinal(){
j=1; //对于空白final进行赋值操作
System.out.println("输出无参数j的值"+j);
p=new Popet(1);//initiazlize blank final reference,
System.out.println("输出无参数p的值"+p);
}
public Blankfinal(int x){
j=x;
System.out.println("输出有参数j的值"+j);
p=new Popet(x);//受影响行代码为 private final Popet p;//blank final reference
System.out.println("输出有参数p的值"+p);
}
public static void main(String[] args){
new Blankfinal();
new Blankfinal(4);
}
}