这是我的代码,但我没有得到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));
}
}
提前致谢:)
答案 0 :(得分:2)
public static int getValue(char character){
return character;//<-- unicode value is being returned, e.g. char 0 -> int 48
// char ranges from 0 - 65535
}
来自JSL:
5.1.4。扩展和缩小原始转换
以下转换结合了加宽和缩小 原始转换:
byte to char
首先,通过扩展原语将字节转换为int 转换(第5.1.2节),然后将生成的int转换为char 通过缩小原始转换(第5.1.3节)。
答案 1 :(得分:1)
好的,首先是第一件事:
这是一种扩展的原始类型转换,因此这是合法的。你可以:
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之外的代码点。
答案 2 :(得分:1)
char
实际上是Java中的unsigned 16-bit
整数类型。
与其他integer
类型一样,您可以执行从整数常量到任何整数类型的赋值转换,只要它在适当的范围内即可。
这是合法的,
public static int getValue(char character){
return character;
}
答案 3 :(得分:0)
这是因为java中的char是2个字节,int是4个字节。所以它是一个扩展的转换,它在Java中隐式发生。返回值是输入字符上的ASCII值。
答案 4 :(得分:0)
Char是UTF-16代码表示 - 将其读为2字节整数值。 int是4字节的整数值。 Java可以隐式地将较小的积分转换为较大的积分 - char为int,int为long,因为这种转换不会导致精度或数据丢失。
反之亦然 - 你不能隐式地将int转换为char而long转换为int,因为int具有比char更宽范围的可能值。
答案 5 :(得分:0)
简而言之,Java愿意隐式地将char
转换为int
。
它会将其转换为16位Unicode值。
如果输入是&#39; A&#39;你会得到&#39; 65&#39;作为你的输出。
有争议的(由我!)字符和整数是完全不同的,语言不应该如此草率,因为它不时会导致意外行为。
如果你想要章节和经文,请看这里的第5.1.2节:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html