为什么Java在声明原始数据类型时不允许null

这是对我之前的问题的继续,并且是对这个问题的答案的回答

Java将原始数据类型包装到包装类然后为什么

char c = null; // invalid int i = null; // invalid 

不允许但是

 Character cObj = null; // valid Integer iObj = null; // valid 

被允许。

因为基元表示值,而Object变量表示复杂数据对象的引用 (类似于指针)。 没有空值一般,它是一个特殊的关键字“无引用”或空引用 – 这是非常不专业的答案,但我想这将是最合适的。

此外,您认为什么可能是null的数值? 0? -1? 但是,那些是有效的整数,还有什么呢?

我强烈建议您开始熟悉以下复杂的Java教程。 您一直在询问的每个方面都在那里解释并通过示例支持。

null表示“缺少对象”。 引用可以缺少对象,原语不能。

Java原始类型变量是按值存储而不是按引用存储变量。 其中包装类是对象基本上与任何其他Java对象一样,除了他们所做的只是包装基本类型。

引用值(通常只是引用)是指向这些对象的指针,以及一个特殊的空引用,它指的是没有对象。

根据jls-4.3.1 ,在没有对象的情况下采用null引用是没有意义的。

除了以上所有答案,我还想补充这一点。

对于原始类型,我们有固定的内存大小,即对于int我们有4个字节,char我们有2个字节。 并且null仅用于对象,因为内存大小不固定。

所以默认我们有,

  int a=0; 

并不是

  int a=null; 

与其他原始类型相同,因此null仅用于对象而不用于基本类型。

像Character和Integer这样的对象是指针:存储在字节中的实际数字是该变量的值,表示内存中JVM内存的其余部分的地址。 因此,将该数字设置为无处可去的地址是可能且有意义的,这就是null。

但是,像int或char这样的原语有一个数字被解释为数字(整数或ASCII代码),并且没有办法使它“不是数字”,因为内存可能存储的所有数字都是数字。

参考拆箱/自动装箱,您必须想象它们是编译器采用的两种方式,以避免因为从原语到对象的连续“转换”而疯狂,但反之亦然,但它们并非完美无瑕。

如果您的Integer包装器为空并且您进行除法会发生什么? 不是除以0而是Null指针exception,因为java无法取消装入未引用的对象!

因此,为基元和对象保留不同的init规则是安全和合理的。