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

时间:2014-11-18 07:50:04

标签: java methods return-value return-type

这是我的代码,但我没有得到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));
    }

}

提前致谢:)

6 个答案:

答案 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节)。

see more

答案 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