java中方法的最终参数

cha*_*ura 16 java methods final

我对这段代码有2个问题

  1. 方法1工作正常,方法2没有.这是什么原因?
  2. 在方法1中,返回值是字节(8位).但实际上我们返回一个char值(16位).这里到底发生了什么?

//方法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位无符号价值,同时byte8位有符号值.允许的字节范围是[-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)