Java中的char类型有点奇怪吗?

时间:2011-11-04 02:28:09

标签: java char

让我们考虑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 类型的内部行为是什么?

3 个答案:

答案 0 :(得分:8)

Char是一种原始的数字整数类型,因此受制于这些野兽的所有规则,包括转换和促销。您需要阅读此内容,JLS是最佳来源之一:Conversions and Promotions。特别是,请阅读“5.1.2加宽原始转换”的短位。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

我们中间的老人可能是教过并记住大部分的ASCII表,而不是Unicode表,而且我仍然在我的办公桌上保留一张ASCII婴儿床,以便快速推荐。哦,并且为Henery的评论+1,因为我实际上澄清了我写的内容。