这是对我之前的问题的继续,并且是对这个问题的回答的补充Declaration of wrapper classes
Java将原始数据类型包装到包装类,然后
char c = null; // invalid
int i = null; // invalid
是不允许的,但
Character cObj = null; // valid
Integer iObj = null; // valid
是允许的。
答案 0 :(得分:39)
因为基元代表值,而对象变量代表复杂数据对象的引用(类似于指针)。 一般没有空值,它是一个特殊的关键词,“什么都没引用”或空引用 - 这是非常不专业的答案,但我想这是最合适的。
此外,您认为什么可能是null的数值? 0? -1?但是,那些是有效的整数,还有什么呢?
我强烈建议您开始熟悉以下complex java tutorial.您在此处所解释的每个方面都会在此处进行解释,并通过示例提供支持。
答案 1 :(得分:31)
null
表示“缺少对象”。引用可以缺少一个对象,原语不能。
答案 2 :(得分:3)
Java原始类型变量是按值存储而不是按引用存储变量。其中包装类是对象基本上与任何其他Java对象一样,除了他们所做的只是包装基本类型。
答案 3 :(得分:2)
参考值(通常只是引用)是指向这些的指针 对象,以及一个特殊的空引用,它不引用任何对象。
根据jls-4.3.1,在没有对象的情况下采用null
引用是没有意义的。
答案 4 :(得分:2)
除了以上所有答案,我还想补充这一点。
对于原始类型,我们有固定的内存大小,即对于int,我们有4个字节,char我们有2个字节。并且null仅用于对象,因为内存大小不固定。
所以默认我们有,
int a=0;
而不是
int a=null;
与其他原始类型相同,因此null仅用于对象而不用于基本类型。
答案 5 :(得分:1)
像Character和Integer这样的对象是指针:存储在字节中的实际数字是该变量的值,表示内存中其余JVM内存的地址。因此,将该数字设置为无处可去的地址是可能且有意义的,这就是null。
然而,像int或char这样的原语有一个被解释为数字(整数或ASCII代码)的数字,并且没有办法使它“不是数字”,因为内存可以存储的所有内容都是号。
答案 6 :(得分:1)
参考拆箱/自动装箱,您必须想象它们是两种方式,编译器采用这两种方式来避免因为从原语到对象的连续“转换”而疯狂,但反之亦然,但它们并非完美无瑕。
如果您的整数包装器为空并且您进行了除法,会发生什么?不是除以0而是Null指针异常,因为java无法取消装入未引用的对象!
因此,为基元和对象保留不同的init规则是安全和合理的。