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

为什么Java在声明基本数据类型时不允许null,java,wrapper,Java,Wrapper,这是我上一个问题的延续,也是对这个问题的回答 Java将原始数据类型包装到包装类,为什么 char c = null; // invalid int i = null; // invalid 不允许,但 Character cObj = null; // valid Integer iObj = null; // valid 是允许的。因为原语表示值,而对象变量表示对复杂数据对象的引用(类似指针)一般来说没有空值,这是一个特殊的关键字“无引用”或空引用-这是一个非常不专业的答案,但我想这将是

这是我上一个问题的延续,也是对这个问题的回答

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

char c = null; // invalid
int i = null; // invalid
不允许,但

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

是允许的。

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

此外,你认为空值的数值是多少?0? -1.但是,这些都是有效的整数,那么还有什么呢


我强烈建议您开始熟悉以下内容,您所询问的每一个方面都在这里进行了解释,并提供了示例支持。

null
表示“缺少对象”。引用可以缺少对象,原语不能。Java原语类型变量是按值存储的,而不是按引用存储的变量。其中,as-wrapper类是对象,基本上与任何其他Java对象类似,只是它们所做的只是包装一个基本类型。

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

然而,像int或char这样的基元有一个被解释为数字(整数或ASCII码)的数字,并且没有办法使它“不是数字”,因为内存可能存储的只是数字

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


根据,在不存在对象的情况下进行
null
引用是毫无意义的。

关于取消装箱/自动装箱,您必须想象编译器采用了两种方法,以避免您在从原语到对象以及从原语到对象的连续“转换”过程中发疯,但它们并非完美无缺

如果整数包装器为空,并且进行除法,会发生什么情况?不是被0除,而是空指针异常,因为java无法取消对未引用对象的装箱


因此,为原语和对象保留不同的init规则是安全且合乎逻辑的。

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

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

所以默认情况下我们有

   int a=0;
而不是

   int a=null;

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

因为基元类型不能为
null
。因为整数值为空,所以alwez将为0且从不为null。(对于int)@qqilihq:)这是我的问题,为什么?既然java进行包装,那么为什么java不包装原始数据类型并允许
null
valuesprimitive数据类型存储在堆栈上,而对象分配在堆上,因此对象可以有null引用。@VineetKasat感谢vineet的回复,您的回复提出了一个问题,为什么我不能为存储在堆栈中的原始数据类型指定null值,我甚至可以在堆栈的值中指定null值,我正在阅读一篇文章,其中关于大小小于64的数组的值存储在堆栈内存中。这意味着我也可以为存储在堆栈内存中的数据类型分配空值。我认为这不是正确的答案,首先在Java中,字符不是1字节的,而是2字节的,因为某些特定的原因,请搜索google,我从来没有听说过Java中的32位和64位基元类型,因为这是java独立于操作系统的第一个条件。谢谢兄弟,刚才解释了答案,没有想到字符内存空间,在我看来是一个字符的字符串,所以它是1字节。但是它的2字节我可以做
字节b=null;字节b1=b?byte MinValue?当然可以,但当
b
解除绑定时,会得到一个空指针。将byte/Integer转换为byte/int的安全方法?