既然已经申明为final为什么要赋值两次呢?

解决方案 »

  1.   

    这不是实际的程序,我也知道final变量不能重复赋值。
    我在学习java language specification,研究里面的chap16时发现的。
    不会是javac的bug吧。
      

  2.   

    这什么bug啊???
    不能赋值两次就是不能,因为是常量啊
    不懂楼主怎么想的
      

  3.   

    已经是final的变量是不能重复赋值的
      

  4.   

    拜托大家看清楚再说。
    两段代码在if前都给f赋值了,只不过一个在声明时赋值,一个在声明后给blank final赋值。如果不明白blank final,请看看JLS先。我不会问那么低级的问题的。
    ruru235(denny_blue) :第一段代码给f赋值两次,为什么可以?
    fast_time(fast_time) :final变量可以不在声明的时候初始化吧,第一段代码第4行不是初始化么?
      

  5.   

    估计大部分人不像我这么变态去研究这么晦涩的东西,再给大家一个例子,我想大部分人解释不清:
    JDK版本:j2sdk1.4.1_01
    A.java  编译通过
    class A {
    void fun(){
    final int f;
    f = 1;
    if(false){
    f = 1;
    }
    // f = 1;
    }
    }B.java   第8行出错:variable f might already have been assigned to
    class A {
    void fun(){
    final int f;
    // f = 1;
    if(false){
    f = 1;
    }
    f = 1;
    }
    }这个和楼顶的问题,解释清楚任何一个送分200,另外发贴送分。
      

  6.   

    wkrain(花土沟的骆驼刺) :你说的我明白,我不明白的是2段代码有何区别?为何编译之后一个通过一个出错?
      

  7.   

    应该是与Java language specification中第16章Definite Assignment有关,但是看了一遍,用其中的规则无法解释上面的现象。
    哪位能帮忙,不胜感激。
      

  8.   

    形如final int f;中,f称为blank final
    而final int f =0;中,f为non-blank final
    对于楼顶的代码,
    第二个出错原因在于,
    The language forbids assigning to a non-blank final(4.5.4)
    第一个没有出错是因为f是blank final,所以4.5.4规则不再适合,而应该参考16.1.1和16.2.7
      

  9.   

    关于代码
    B.java   第8行出错:variable f might already have been assigned to
    class A {
    void fun(){
    final int f;
    // f = 1;
    if(false){
    f = 1;
    }
    f = 1;
    }
    }
    参见JTL 16.2.7中
    V is [un]assigned after if (e) S iff V is [un]assigned after S and V is [un]assigned after e when false. 
    套用进来,表达式如下:
    "f" is unassigned after "if (false) f=1;" iff "f" is unassigned after "f=1;" and "f" is unassigned after "false" when false. 
    显然,该代码不满足 f is unassigned after f=1;这个条件,所以,在这个if bloack之后,f已经处于assigned状态了。
      

  10.   

    多谢Mars_lee(二子),你看的跟我差不多,这也正是我期待的答案,但是还有些问题需要探讨:
    1.The language forbids assigning to a non-blank final是JLS中的原话么?我没找到
    2.楼顶的第一段代码如果按照4.5.4中的"It is a compile time error if a final  variable is assigned to unless it is definitely unassigned (§16) immediately prior to the assignment."分析,不是应该出错么?能不能帮我解释一下?
      

  11.   

    抱歉,是我的描述有些错误
    1、这应该是JTL chapter 16中写的,原话如下:
    every blank final variable must be assigned at most once; it must be definitely unassigned when an assignment to it occurs
    2、第一段代码中,f是non-blank final,所以这句话"It is a compile time error if a final  variable is assigned to unless it is definitely unassigned (§16) immediately prior to the assignment.""不适合
      

  12.   

    faint
    为了查这个问题,我已经有点晕了
    这个解释还是不对,稍等