我想知道为什么这个代码段有用。
char ch1;
ch1 = 'a' + 1;
System.out.println(ch1);
在第2行中,右侧未升级为int
,然后将int
分配给char
,我们是否需要显式转换?
同样,我了解当你ch1 = 65
时会发生什么。但由于Java不允许自动向下类型转换,我们是否需要从int
到char
进行显式转换?
答案 0 :(得分:10)
因为Java Language Specification说:
此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):
如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示。
所以你是正确的,因为表达式被提升为int
,但因为它是一个常量表达式,所以不需要强制转换。如果它涉及变量(或其值不适合char
),则会有所不同。
对于这类问题,最好立即查看语言规范,因为它是权威来源,对规范来说非常易读。
答案 1 :(得分:3)
我目前正在使用Eclipse。有两点需要注意:
3 * (2 + 1)
。这有效:
byte b = 127; // works, range of a byte is [-128, 127]
但这不是:
byte b = 128; // does not work, outside of range
这有效:
byte b = 100 + -228; // works, 100 + -228 = -128
但这不是:
byte b = 1;
byte c = b + 1; // does not work, why not?
这也不是:
byte b = 1;
byte c = b + (byte) 1; // does not work, why not?
请注意b
是一个变量表达式。如果涉及变量表达式,则运算符+
的结果至少与int 一样大。因此,您无法将其分配给c
。与常量表达式不同,编译器不计算变量表达式。
编译器会同样抱怨short
和char
- 自己尝试一下。
最后,在变量上使用final
有效地将其转换为常量表达式,因此这将起作用:
final byte b = 1;
byte c = b + 1; // works