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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 弘一 中级黑马   /  2013-12-17 18:45  /  989 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我在查看String类源码的时候,发现了
private final char value[];
不是被final修饰的成员变量都是常量。应该在成员变量定义的时候需要进行赋值,这样才会有value的地址值这个常量的吗?
而我自己写则是会报错。
class Test
{
      //Test.java:5: 错误: 可能尚未初始化变量value
     private final char value[];
     public static void main(String[] args)
     {}
}

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

5 个回复

倒序浏览
final变量的初始化必须在构造函数执行完之前初始化
初始化位置
一是其定义处,也就是说在final变量定义时直接给其赋值,
二是在构造函数中。而且在Java1.1以前,只能是在定义时给值。
三是在初如化代码块中{} 或者 static{}
你所定义的final在默认构造方法执行完之后仍然没内赋值,所以出错

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
final修饰的是常量,但是赋值动作不一定是在定义时赋值的,
只要在构造函数完成之前赋值就可以了。
建议:
      你看看String源码的构造函数,在构造函数中肯定有给
final修饰的常量赋值动作。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
final关键字用于申明变量时,该变量一旦被设定,就不可以改变该变量的值。所以一般final关键字定义的变量必须在声明时对其进行赋值操作。所以你的问题应该是缺少赋值操作,编译时才会报错的。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
litaojisuanji 发表于 2013-12-17 20:13
final修饰的是常量,但是赋值动作不一定是在定义时赋值的,
只要在构造函数完成之前赋值就可以了。
建议:

对喔!谢谢啦!
回复 使用道具 举报
final关键字:可以修饰类,方法,变量等。
  如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。
  如果变量和方法声明为final,可以保证他们在使用中不被改变。被声明的final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。而被final修饰的方法也同样只能使用,不能被覆盖。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马