今天上课时, 老师讲到final关键字, 明确的说到final修饰的字段只能使用显式初始化进行初始化, 不能使用构造方法进行初始化, 我十分疑惑, 做了如下测试.
运行结果: 事实证明, final修饰的非静态的成员变量是可以通过构造方法进行初始化的, 但是考虑到一个类中的构造方法可能有多个因素, 我又加入了一个无参的构造方法 可以发现添加无参构造方法之后, 编译直接报错了, 但是如果在无参构造方法中对final修饰的字段进行显式赋值, 则编译又可以通过了.
那么final修饰的静态字段是不是也是这样的呢? 不难发现直接就编译报错了, 其实也好理解, 静态的成员变量在类加载进方法区的类代码区时就已经在静态数据区中开辟了空间, 而此时并没有创建对象也就并不能调用构造方法, 没法在该字段开辟空间后为其初始化, 所以以上面的理解, final修饰的字段在开辟空间后必须得保证它会被显式赋值一次且只被赋值一次的结论显然是不符合的, 所以final修饰的静态字段只能被静态初始化块或者显示初始化初始化, 同样的也只能被初始化一次.
以上都为个人理解, 若有错误或不足还请大佬指出指教