今天在看java中String的源码,发现了自己对final变量初始化的了解不够好,有遗漏的地方,之前只知道第一种初始化方法。

public class FinalStudy {
    //第一种 在定义后直接初始化
    private final int a = 1;
    //第二种 声明变量后在构造方法中为其赋值
    //如果采用用这种方式,那么每个构造方法中都要有j赋值的语句
    private final int b;
    public FinalStudy(int b) {
        this.b = b;
    }
    // 初始化方式三,声明变量后在构造代码块中为其赋值
    // 如果采用此方式,就不能在构造方法中再次为其赋值
    // 构造代码块中的代码会在构造函数之前执行,如果在构造函数中再次赋值,
    // 就会造成final变量的重复赋值
    private final int c;
    {
        c = 3;
    }
}