为什么char类型的默认值不会在控制台上显示?

4
我希望能够了解在尝试打印char默认值时会显示什么内容在控制台上。但不幸的是,我在控制台上看不到任何东西。为什么?
我应该能够看到0。因为char变量的默认值是空字符,即'\u0000'(十进制等价于0),请纠正我是否有误。
代码:
public class Index {
    static char c;
    public static void main(String[] args) {
        System.out.println("char default value is: "+Index.c);
    }
}

输出控制台:

输入图片说明


1
如果你写了 static char c = 65;,你会期望它打印出 65 还是 A - Andy Turner
1
由于您正在从静态方法中调用,因此可以通过引用“c”而不是“Index.c”进行打印。 - Eduardo Dennis
3个回答

9

“十进制数字0”的字符是U+0030,与控制字符“空字符”U+0000有很大的区别,因为空字符没有可打印输出。你正在打印后者,所以我不会期望看到0。

换个角度思考:

System.out.println("a\u0009b");

你会希望它打印出"a9b"吗?不应该,因为U+0008是制表符,所以你会看到类似于"a b"的一些内容,其中间隔的空格数量取决于你的输出设备。


4
很久以前,我还年轻的时候,有一件事叫做ASCII表。那时,一个字符(如'a'、'@'或终端中的某个动作)只有128种不同的数字表示形式。
但即使在那个时候,字符'0'的十进制值也是48。
现在情况有些改变了,我们有Unicode、UTF-8、UTF-16等等。
但故事并没有改变太多,对于每个字符,都有一个代码来表示给定编码中的字符。
正如您可能已经明白的那样,'\u0000'不是字符0
请查看UTF-8表,了解哪个字符是哪个代码。
char zero = '0';
System.out.println(String.format("%d", (int)zero));
System.out.println(String.format("%04X", (int)zero));

更新

根据@TomBlodget的友情提醒,对此帖进行了小幅更新。

我们还应该提到ISO-8859-1常见的欧洲编码。它能够用一个字节编码àäöòåèéüù和其他字符,前127个字符与US-ASCII相同(出于方便考虑,通常如此)。

怎么能忘记著名的OEM437代码页呢?这个字符集长期以来一直是EGA和VGA兼容图形卡核心中的主要字体。

我还要补充一点,非常常见的UTF-8编码也包含US-ASCII字符集,但会将字符编码为两个字节。


你的帖子对我有所帮助! - coderpc
不确定我理解你的意思... :) 但无论如何,我很高兴你弄清楚了。 - freedev
我通过你发的ASCII表格找到了答案。@freedev - coderpc
@freedev,你至少可以链接到一个显示ISO 8859-1而不是其他“扩展ASCII”的网页。如果你要谈论一个_Java的文本数据类型不使用_的字符集,至少ISO 8859-1是一个子集。(此外,你确定你在学习ASCII时没有使用类似OEM437的东西吗?) - Tom Blodget
@TomBlodget 对的。我在帖子中写了一个小附录 :) ...并将所有链接更改为维基百科。 - freedev

2

char 的默认值是 \u0000。虽然十进制等价于 0,但您不会看到零,就像执行以下操作将打印 A 而不是 65

static char c = 65;
System.out.println(c);

如果您的代码是这样的System.out.println(c==0);,它将返回true,因为它们是等价的,就像您提到的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接