我发现实例变量“ char”的默认值为“ u0000”(空的unicode)。但是当我尝试下面的代码时,我只能看到一个空的打印行。请给我澄清。
public class Basics {
char c;
int x;
public static void main(String[] args) {
Basics s = new Basics();
System.out.println(s.c);
System.out.println(s.x);
}
}
控制台输出如下:
(empty line) 0
答案 0 :(得分:3)
'\u0000'
(char c = 0;
)是a Unicode control character。您不应该看到它。
System.out.println(Character.isISOControl(s.c) ? "<control>" : s.c);
答案 1 :(得分:1)
尝试
System.out.println((int) s.c);
如果要查看默认值char
(即0
)的数值。
否则,它只打印空白(不是空行)。
如果您在s.c
之后添加可见字符,您会发现它不是空行:
System.out.print ("--->");
System.out.print (s.c);
System.out.println ("<---");
将打印:
---> <---
答案 2 :(得分:1)
能否请您提供更多有关为何选择unicode作为char数据类型的默认值的更多信息?这背后有什么具体原因吗?
已经认识到,要成为Java的语言默认需要支持多语言字符集。当时,Unicode是实现它的新标准方式 1 。 Java首次采用Unicode时,Unicode仅使用16位代码。这导致Java设计人员将char
指定为无符号16位整数类型。不幸的是,Unicode迅速扩展到超过16位,并且Java必须适应...通过转换为Java的本地内存中文本编码方案UTF-16。
有关更多背景信息:
但是请注意:
char
的宽度是如此牢固,以至于无法更改。实际上,如果要表示Unicode 代码点,则应使用int
而不是char
。 1-仍然是标准方式。 AFAIK目前没有Unicode的可靠替代品。
选择\u0000
作为char
的默认初始值的特定原因是因为它为零。默认情况下,通过将所有零字节写入所有字段来初始化对象,而不管其类型如何。对于整数类型和浮点类型,此映射为零;对于false
,此映射为boolean
;对于引用类型,此映射为null
。
碰巧\u0000
字符映射到ASCII NUL
控制字符,这是非打印字符。