A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chenxin_0916 中级黑马   /  2015-12-30 23:52  /  652 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

final修饰的成员变量只能是显示赋值和构造函数赋值.
class Demo{
          final int a;
           a = 1;
....................................................
}
在类中,这样赋值的时候会报错,为什么了?

3 个回复

倒序浏览
本帖最后由 Clouddd 于 2015-12-31 09:55 编辑

首先,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编译成字节码还有方法区中存放方法的位置你就会有更深的了解啦。
所以现在不需要着急,不用搞明白原理,先会用,用的很熟悉,再去明白原理。
回复 使用道具 举报
luyang18 来自手机 中级黑马 2015-12-31 12:23:59
藤椅
2楼说的很详细,学习了
回复 使用道具 举报
谢二楼,我也不是很清楚,记下了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马