为什么int类型方法允许字符类型作为返回值?

这是我的代码,但我没有得到int getValue()方法如何接受char类型作为返回值。 它是如何工作的? 请问任何人可以解释一下这种方法是如何工作的?

 public class CharToInteger { private static Scanner input; public static int getValue(char character){ return character; } public static void main(String[] args) { input = new Scanner(System.in); System.out.println("Enter a character to get value of it:"); String inputString=(String) input.next(); char inputCharacter=inputString.charAt(0); System.out.println(getValue(inputCharacter)); } } 

提前致谢 :)

好的,首先要做的事情是:

这是一个扩大的原始类型转换,所以这是合法的。 您可以:

 int foo() { return 'a' /* character constant */ }; long foo() { return 3; /* int constant */ } 

但你不能这样做:

 char foo() { return 1; /* int constant */ } int foo() { return 1L; /* long constant */ } 

第二:它返回的不是所有的ASCII码。 Java做Unicode。

恰好在创建Java时,Unicode只定义了符合16位的代码点; 因此, char被创建为2字节无符号基元类型(它是Java中唯一的无符号基元类型),与当时称为UCS-2字符编码(编码和代码点之间的1对1映射)相匹配。

然而,之后Unicode变为“宽”,并且出现了BMP之外的代码点(即,大于U + FFFF); 从那时起,UCS-2变成了UTF-16,BMP之外的代码点需要两个char来代表一个代码点(一个主要的代理和一个尾随的代理;在以前的Unicode版本中,在Java API中,这些代码被称为resp。和低代理人。 因此, char现在是UTF-16代码单元。

但是,对于BMP中的代码点, char值仍然与代码点完全匹配。


现在,为了“修复”您的程序以准确显示每个可能条目的“字符值”,即代码点,您将这样做(Java 8):

 public static void main(String[] args) { final Scanner input = new Scanner(System.in); System.out.println("Enter a character to get value of it:"); String inputString = input.next(); // Print -1 on an empty input final OptionalInt codepoint = inputString.codePoints().findFirst(); System.out.println(codepoint.isPresent() ? codepoint.get() : -1); } 

这也将处理BMP之外的代码点。

 public static int getValue(char character){ return character;//<-- unicode value is being returned, eg char 0 -> int 48 // char ranges from 0 - 65535 } 

来自JSL:

5.1.4。 扩大和缩小原始转换

以下转换结合了扩展和缩小基元转换:

字节到字符

首先,通过扩展原语转换(第5.1.2节)将字节转换为int,然后通过缩小基元转换(第5.1.3节)将结果int转换为char。

看到更多 :

char实际上是Java中的unsigned 16-bit整数类型。

与其他integer类型一样,您可以执行从整数常量到任何整数类型的赋值转换,只要它在适当的范围内即可。

这是合法的,

 public static int getValue(char character){ return character; } 

这是因为java中的char是2个字节,int是4个字节。 所以这是一个扩展的转换,它在Java中隐式发生。 返回值是输入字符的ASCII值。

Char是UTF-16代码表示 – 将其读为2字节整数值。 int是4字节的整数值。 Java可以隐式地将较小的积分转换为较大的积分 – char为int,int为long,因为这种转换不会导致精度或数据丢失。

反之亦然 – 你不能隐式地将int转换为char而long转换为int,因为int具有比char更宽范围的可能值。

简而言之,Java愿意隐式地将char转换为int 。 它会将其转换为16位Unicode值。 如果输入为“A”,则输出为“65”。

可以说(由我!)角色和整数是完全不同的,语言不应该如此草率,因为它不时会导致意外行为。

如果你想要章节和经文,请看这里的第5.1.2节:

https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html