Java中的char类型也是int类型吗?

6

我正在尝试完成一些课程相关的代码:

public int getValue(char value) {
    if (value == 'y') return this.y;
    else if (value == 'x') return this.x;

由于最终可能无法返回任何内容,因此它告诉我在最后执行此操作:

return value;

这让我感到惊讶,因为该方法的返回类型是int类型。但是,它告诉我要返回一个char!我使用的是eclipse,习惯了无数的警告和提示,但这却是一个很大的惊喜。
那么,char真的是int吗?为什么会出现这种情况?

5
http://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.2 - Sotirios Delimanolis
每个字符都有一个与之关联的字符代码。字符代码是一个整数。当你将char强制转换为int时,你会得到该字符的字符代码... - brso05
那么它基本上会返回与字符相关联的ASCII值? - Zizouz212
@brso05,你所谓的“字符代码”实际上是UTF-16代码单元,其中一个或两个代码单元编码一个Unicode代码点,一个基本代码点和任意数量的“组合字符”代码点形成一个字形,这是一个文本元素,例如Ç。 - Tom Blodget
7个回答

7

Java语言规范指出:

当一个带有表达式的返回语句出现在方法声明中时,该表达式必须可以赋值(§5.2)给方法声明的返回类型,否则会出现编译时错误。

其中,是否可以将一个值赋给另一个值由以下规则定义:

赋值上下文允许使用以下内容之一:

并且

“扩展原始类型转换”是指将某些基本类型转换为另一种更宽的类型,共有19种特定的这样的转换。其中包括:将 `char` 转换为 `int`、`long`、`float` 或 `double`。
最后,“扩展原始类型转换”不会在以下情况下丢失关于数字值整体大小的信息,而且数字值可以完全保留:[...] 将 `char` 转换为整数类型 `T` 时,将 `char` 值的表示零扩展以填充更宽的格式。
简而言之,`return` 语句中的 `char` 值可以通过“扩展原始类型转换”分配给返回类型为 `int` 的函数。

2

charint小,所以你可以返回它,并在前面添加零以使数字更长。但这不是正确的返回值 - 在您的情况下,我可能会抛出异常; 但是编辑建议使用它,因为这是您被允许返回的内容,并且需要返回一些内容。

以下代码是合法的:

char c = 'h';
int i = c;

2
在计算机中,一切都是数字!只有位和字节。
int、char、byte、short和long都只是数字。char只是一个数字,编译器知道它通常用于显示特定数字表示的字符(例如32 = 空格,48 = 零等)。
字符串是一系列数字和其他东西,所以稍微复杂一些。我们不想深入探讨。
int是一个四字节的数字,char是一个两字节的数字,因此你可以将任何char数字放入int中。
Java的设计者决定让你在不需要任何特殊强制转换或转换的情况下从char转换为int。

2
一个 char 不是一个 int。然而,它是一种 整型。也就是说,它被认为是一个可以转换为其他整型(longshortbyteint)的整数,根据 Java 语言规范

基本上这意味着它可以赋值给 int。它的值介于 0 到 65535 之间,如果你将其赋值给一个 int 或将其强制转换为 int 并打印它,你将得到它所代表字符的 UTF-16 值。


1

根据Java的定义,char是一个8位无符号整数。(0到256)

int是一个32位有符号整数。(-2,147,483,648到2,147,483,647)

char a = 65;                    //65 is the ASCII Number of 'A'
System.out.println(a);
>>> A

b = a + 1
System.out.println(b);
>>> B

Java自动装箱将char转换为int,反之亦然。


1

intchar 以及相反方向的转换是隐式且自然的。请注意,这意味着你可以在 char 上使用通常定义的算术运算,这在需要对字母表进行迭代时非常方便:

for (char c='a' ; c<='z' ; c++) { ... }

请注意,char类型占用2个字节,而int类型占用4个字节,因此将int强制转换为char可能会导致整数溢出。


好的,谢谢。基本上,它会隐式转换为整数,而且这是单向的吗? - Zizouz212
无论如何,完美的答案。我不知道它会隐式地转换...我习惯了一切都是显式的(我来自一个Pythonic的世界) :) - Zizouz212
请注意,char 是两个字节长。它基本上是一个无符号的 short - Cephalopod
2
什么?Java不会隐式地将int转换为char。你可以显式地进行转换,但两种方式的效果并不相同。 - Louis Wasserman

-2
希望这个小例子能解决你的困惑:
public int getValue(int value) { 
    if (value == 'y') 
        return this.y; 
    else if (value == 'x') 
        return this.x; 
}

如果你将 char 作为一个 int 传递,比如 getValue('x'),它会返回这个 int 的值。

但是如果值是 d 呢?那么我就不想返回 x - Zizouz212
它将返回返回字符的ASCII值。 - javaHacker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接