估计大部分人不像我这么变态去研究这么晦涩的东西,再给大家一个例子,我想大部分人解释不清: 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,另外发贴送分。
应该是与Java language specification中第16章Definite Assignment有关,但是看了一遍,用其中的规则无法解释上面的现象。 哪位能帮忙,不胜感激。
形如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
关于代码 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状态了。
多谢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."分析,不是应该出错么?能不能帮我解释一下?
抱歉,是我的描述有些错误 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.""不适合
我在学习java language specification,研究里面的chap16时发现的。
不会是javac的bug吧。
不能赋值两次就是不能,因为是常量啊
不懂楼主怎么想的
两段代码在if前都给f赋值了,只不过一个在声明时赋值,一个在声明后给blank final赋值。如果不明白blank final,请看看JLS先。我不会问那么低级的问题的。
ruru235(denny_blue) :第一段代码给f赋值两次,为什么可以?
fast_time(fast_time) :final变量可以不在声明的时候初始化吧,第一段代码第4行不是初始化么?
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,另外发贴送分。
哪位能帮忙,不胜感激。
而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
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状态了。
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."分析,不是应该出错么?能不能帮我解释一下?
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.""不适合
为了查这个问题,我已经有点晕了
这个解释还是不对,稍等