我在java中看不到实例"char"的默认值



我发现实例变量"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控制字符,该字符是非打印字符。

最新更新