这个如何编译才不会报错呢?据我了解,编译器检查变量的类型(在本例中String
),然后查看右侧表达式的类型是否对应于变量的类型(或至少是一个子类型,但让我们坚持使用简单的情况String
类,因为它是最后的)。
public class InitClass {
public static void main(String[] args) {
String str = (str = "hello");
System.out.println(str);
}
}
我的问题是如何str = "hello"
编译?编译器是否已经意识到str
应该是类型String
?
当评估一个赋值表达式 http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.26.1
首先,计算左侧操作数以生成一个变量。如果
这个评估突然完成,然后赋值表达式
出于同样的原因突然完成;右边的操作数不是
评估并且没有分配发生。
这产生了变量str
. Then
否则,计算右侧操作数。如果这个评价
突然完成,则赋值表达式突然完成
出于同样的原因,不会发生任何分配。
在您的示例中,右侧操作数本身就是另一个赋值表达式。所以str
,赋值运算符的右侧操作数,再次被计算以产生一个变量,str
. Then
否则,右侧操作数的值将转换为
左侧变量的类型,进行值集转换
(§5.1.13)到适当的标准值集(不是一个
扩展指数值集),转换的结果是
存储到变量中。
So "hello"
被存储到str
. 自从 http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.26
在运行时,赋值表达式的结果是
赋值发生后的变量。结果
赋值表达式本身不是变量。
的赋值结果"hello"
to str
是值"hello"
,该值再次存储在str
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)