关于final修饰的字段初始化问题

在Java中final修饰的字段到底能不能使用构造器进行初始化?

今天上课时, 老师讲到final关键字, 明确的说到final修饰的字段只能使用显式初始化进行初始化, 不能使用构造方法进行初始化, 我十分疑惑, 做了如下测试.

关于final修饰的字段初始化问题
运行结果:
关于final修饰的字段初始化问题
事实证明, final修饰的非静态的成员变量是可以通过构造方法进行初始化的, 但是考虑到一个类中的构造方法可能有多个因素, 我又加入了一个无参的构造方法
关于final修饰的字段初始化问题
可以发现添加无参构造方法之后, 编译直接报错了, 但是如果在无参构造方法中对final修饰的字段进行显式赋值, 则编译又可以通过了.

于是我得出了个人的一个结论:final修饰的非静态的字段, 在虚拟机为它开辟空间时必须得保证它会被显式赋值一次且只被赋值一次, 不管是在初始化块时, 显式初始化时, 还是构造方法初始化时, 也就是说如果在在初始化块中对final修饰的字段进行了初始化, 那么就不能进行显示初始化, 也不能使用构造方法初始化, 如果在定义字段时就显式赋值了, 那么同理不能进行初始化块初始化和构造方法初始化, 以此类推.但是使用构造方法初始化时, 要注意必须在每一个构造器中都对final修饰的字段初始化, 不然就存在该字段可能没有赋值的可能

那么final修饰的静态字段是不是也是这样的呢?
关于final修饰的字段初始化问题
不难发现直接就编译报错了, 其实也好理解, 静态的成员变量在类加载进方法区的类代码区时就已经在静态数据区中开辟了空间, 而此时并没有创建对象也就并不能调用构造方法, 没法在该字段开辟空间后为其初始化, 所以以上面的理解, final修饰的字段在开辟空间后必须得保证它会被显式赋值一次且只被赋值一次的结论显然是不符合的, 所以final修饰的静态字段只能被静态初始化块或者显示初始化初始化, 同样的也只能被初始化一次.

以上都为个人理解, 若有错误或不足还请大佬指出指教