我在 java 中看不到 "char" 等默认值

I can't see default value for instance "char" in java

我发现实例变量 "char" 默认值是 "u0000"(unicode of null)。但是当我尝试使用下面的代码时,我只能看到一个空的打印行。请给我解释一下。

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

尝试

System.out.println((int) s.c);

如果您想查看默认值 char(即 0)的数值。

否则,它只会打印一个空白(不是空行)。

s.c:

之前添加可见字符可以看出不是空行
System.out.print ("--->");
System.out.print (s.c);
System.out.println ("<---");

将打印:

---> <---

'\u0000' (char c = 0;) is a Unicode control character。你不应该看到它。

System.out.println(Character.isISOControl(s.c) ? "<control>" : s.c);

Could you please provide me more information about why does unicode is selected as default value for char data type? is there any specific reason behind this?

人们认识到,要成为 Java 的语言需要默认支持多语言字符集。当时 Unicode 是新的标准方式1。 Java 最初采用 Unicode 时,Unicode 只使用 16 位代码。这导致 Java 设计者将 char 指定为无符号 16 位整数类型。不幸的是,Unicode 迅速扩展到 16 位以上,Java 不得不适应......通过切换到 UTF-16 作为 Java 的本地内存文本编码方案。

更多背景资料:

但请注意:

  • 在最新版本的 Java 中,您可以选择为文本数据启用更紧凑的表示。
  • char 的宽度是固定的,不可能更改。事实上,如果你想表示一个 Unicode 代码点 ,你应该使用 int 而不是 char

1 - 这仍然是标准方式。据我所知,目前没有可靠的 Unicode 替代品。


之所以选择\u0000作为char的默认初始值,是因为它为零。对象默认通过将所有零字节写入所有字段来初始化,而不管它们的类型。对于整型和浮点类型,这映射到零,对于 boolean,映射到 false,对于引用类型,映射到 null

碰巧 \u0000 字符映射到非打印字符的 ASCII NUL 控制字符。