为什么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规则是安全和合理的。