【问题标题】:The char type in Java behaves somewhat in a strange way?Java 中的 char 类型表现得有些奇怪?
【发布时间】:2011-12-21 16:49:14
【问题描述】:

让我们考虑以下 Java 中的简单表达式。

char c='A';
int i=c+1;

System.out.println("i = "+i);

这在 Java 中完全有效,并返回 66,即 c+1 的字符 (Unicode) 的对应值。


String temp="";
temp+=c;
System.out.println("temp = "+temp);

这在 Java 中太有效了,String 类型变量 temp 自动接受 char 类型的 c 并在控制台上生成 temp=A


以下所有语句在 Java 中也令人惊讶地有效!

Integer intType=new Integer(c);
System.out.println("temp = "+intType);

Double  doubleType=new Double(c);
System.out.println("temp = "+doubleType);

Float floatType=new Float(c);
System.out.println("temp = "+floatType);

BigDecimal decimalType=new BigDecimal(c);
System.out.println("temp = "+decimalType);

虽然 c 是 char 的一种类型,但可以在各自的构造函数中毫无错误地提供它,并且所有上述语句都被视为有效语句。它们分别产生以下输出。

temp = 65
temp = 65.0
temp = 65.0
temp = 65

在这种情况下,Java 中可用的 char 类型的内部行为是什么?

【问题讨论】:

    标签: java char


    【解决方案1】:

    Char 是一种原始数值整数类型,因此受制于这些野兽的所有规则,包括转换和提升。你会想要阅读这个,JLS 是最好的来源之一:Conversions and Promotions。尤其是阅读“5.1.2 扩展原语转换”的简短部分。

    【讨论】:

      【解决方案2】:

      char 有点像 16 位 int。您可以将其他整数连接到字符串上。这是 Character.toString(c) 的快捷方式。

      如果您希望避免这种混淆,可以使用 Character 对象。

      【讨论】:

        【解决方案3】:

        原语 charbyte 可以互换(指的是 Unicode 表值) - 所以是的,char 变量可以被视为数字,就像 byte 一样。

        编辑: 除了下面 Henery 的评论,你当然是对的,Java 确实使用 unicode 来表示字符内容(原始文本已更新以反映这一点) - 但正如我们所知,前 127 个 ASCII 和 Unicode 字符或多或少匹配,并且所以在 0..127 字符范围内执行的任何操作对于 ASCII 和 Unicode 都是相同的,这意味着两者之间的转换是微不足道的。

        我们当中的老前辈可能被教导并记住了 ASCII 表的大部分内容,而不是 Unicode 表,事实上,我仍然在我的办公桌上放了一张 ASCII 婴儿床单以供快速参考。哦,还有 Henery 的评论 +1,让我真正澄清了我写的内容。

        【讨论】:

        • 据我所知,Java 使用 Unicode 而不是 ASCII 来表示相应的字符。请澄清一下。
        猜你喜欢
        • 2020-05-03
        • 2018-07-08
        • 2013-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-02
        • 1970-01-01
        • 2021-12-04
        相关资源
        最近更新 更多