我一直在测试char铸件,我经历了这个:
public class Test {
public static void main(String a[]) {
final byte b1 = 1;
byte b2 = 1;
char c = 2;
c = b1; // 1- Working fine
c = b2; // 2 -Compilation error
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么当我在字节中添加最后一个时它在1中正常工作?
man*_*uti 19
当变量final为时,编译器会自动内联其值为1.此值可表示为a char,即:
c = b1;
Run Code Online (Sandbox Code Playgroud)
相当于
c = 1;
Run Code Online (Sandbox Code Playgroud)
实际上,根据本节关于final变量,b1被视为常量:
原始类型或类型的变量
String,即final,用一个编译时间常量表达式(§15.28)初始化,被称为恒定变量.
Jes*_*per 10
转换为byteto char是一种扩展和缩小的原语转换,如Java语言规范的第5.1.4节所述.
正如JLS所描述的那样,这是通过中间步骤完成的; 将byte被转换为int通过扩展原始转换,然后将int转换为char经由基本收缩转换(参见5.1.3).
第5.2段解释了在执行任务时何时需要演员:
...如果表达式是一个常量表达式(§15.28类型的)
byte,short,char,或int:
- 如果变量的类型是
byte,,short或者char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示.
你的变量b1确实是一个常量,但你的变量b2不是,所以这条规则适用b1但不适用b2.
所以:你可以赋值b1为c因为b1是一个常量而常量的值1适合于a char,但是你不能在没有强制b2转换的c情况下赋值,因为b2它不是常量.
| 归档时间: |
|
| 查看次数: |
987 次 |
| 最近记录: |