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

时间:2013-10-22 07:26:57

标签: java wrapper

这是对我之前的问题的继续,并且是对这个问题的回答的补充Declaration of wrapper classes

Java将原始数据类型包装到包装类,然后

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

是不允许的,但

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

是允许的。

7 个答案:

答案 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规则是安全和合理的。