我发现实例变量"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
'u0000'
(char c = 0;
( 是一个 Unicode 控制字符。你不应该看到它。
System.out.println(Character.isISOControl(s.c) ? "<control>" : s.c);
试试
System.out.println((int) s.c);
如果要查看默认char
的数值(即0
(。
否则,它只会打印一个空白(而不是空行(。
如果您s.c
后添加可见字符,您可以看到它不是一个空行:
System.out.print ("--->");
System.out.print (s.c);
System.out.println ("<---");
将打印:
---> <---
您能否为我提供有关为什么选择 unicode 作为 char 数据类型的默认值的更多信息? 这背后有什么具体的原因吗?
人们认识到,即将成为Java的语言在默认情况下需要支持多语言字符集。 当时 Unicode 是新的标准方式1. 当Java第一次采用Unicode时,Unicode只使用16位代码。这导致 Java 设计人员将char
指定为无符号的 16 位整数类型。 不幸的是,Unicode 迅速扩展到 16 位以上,Java 不得不适应......切换到 UTF-16 作为 Java 的本机内存文本编码方案。
有关更多背景信息:
- 为什么 Java char 使用 UTF-16?
- 为什么Java使用UTF-16作为内部文本表示
但请注意:
- 在最新版本的 Java 中,您可以选择为文本数据启用更紧凑的表示形式。
char
的宽度是如此硬连线,以至于无法更改。 实际上,如果要表示Unicode代码点,则应使用int
而不是char
。
1 - 它仍然是标准方式。 AFAIK 目前没有可靠的 Unicode 替代品。
u0000
被选为char
的默认初始值的具体原因是因为它为零。默认情况下,对象初始化方法是将所有零字节写入所有字段,而不考虑其类型。对于整型类型和浮点类型,这映射到零,对于boolean
映射到false
,对于引用类型,这映射到null
。
碰巧的是,u0000
字符映射到ASCIINUL
控制字符,该字符是非打印字符。