首先,a 是成员变量,成员变量都会在初始化的时候有默认值,而a是int类型,所以默认值为0;但是楼主你用final修饰了成员变量 a,然后又不给a赋值。由于a这个成员变量就是不可改变的,那人家JVM加载这个类,JVM将成员变量初始化的时候就不能将默认值0赋值给a,但是这个a呢,又没有任何值(没错,我说的就是这个a你声明出来到底有什么用),那人家JVM就会纳闷这个a到底有什么。所以给你报错了,很明显抱的错是该成员未被初始化。
所以应该写成
class Demo {
final int a = 1;
}
另外说一句,局部变量中的final或者形式参数的final是可以不在声明的时候赋值的(因为局部变量是没有初始化值),但是只能在往后的代码中赋一次值。,比如
class Demo {
void test () {
final int i;
i = 1;
//i = 2;错误
}
void test (final int i) {
i = 1;
//i = 2;错误
}
}
所以目前在学习阶段,楼主你明白到局部变量中的final或者形式参数的final只能被赋值一次;等你到以后有空了可以再去琢磨final在JVM编译成字节码还有方法区中存放方法的位置你就会有更深的了解啦。
所以现在不需要着急,不用搞明白原理,先会用,用的很熟悉,再去明白原理。