cha*_*ura 16 java methods final
我对这段代码有2个问题
//方法1
static byte m1() {
final char c = 'b'-'a';
return c;
}
Run Code Online (Sandbox Code Playgroud)
//方法2
static byte m3(final char c) {
return c; // 3
}
Run Code Online (Sandbox Code Playgroud)
Roh*_*ain 23
char在Java是一个16位无符号价值,同时byte为8位有符号值.允许的字节范围是[-128, 127].因此,并非所有角色都可以分配byte.
在你的第一种方法,你是返回一个char与代码点= 1('b' - 'a').既然你已经定义了charas final,并为它赋值一个常量表达式,它就变成了编译时常量.因此,编译器不会给出任何编译器错误.
来自JLS第5.2节:
如果表达式是byte,short,char或int类型的常量表达式(第15.28节):
- 如果变量的类型是byte,short或char,则可以使用缩小的原语转换,以及常量的值表达式可以在变量的类型中表示.
强调我的.
但是,如果你进行c非final,它也会导致编译器错误:
static byte m1() { // This will be an error
char c = 'b'-'a';
return c;
}
Run Code Online (Sandbox Code Playgroud)
原因是,c不再是编译时常量,编译器不进行隐式向下转换.
在第二种方法中,您将返回char您传递的内容.参数c没有编译时常量.在编译时不知道该方法可能得到什么值.就像,如果您传递的char代码点不在允许byte值的范围内,它将无效.
要使第二种方法有效,您可以进行显式转换:
static byte m3(final char c) {
return (byte)c; // 3
}
Run Code Online (Sandbox Code Playgroud)