为啥 Java 在声明原始数据类型时不允许 null [重复]

Posted

技术标签:

【中文标题】为啥 Java 在声明原始数据类型时不允许 null [重复]【英文标题】:Why Java does not allow null while declaring primitive data types [duplicate]为什么 Java 在声明原始数据类型时不允许 null [重复] 【发布时间】:2013-10-30 22:54:09 【问题描述】:

这是我上一个问题的延续,并根据这个问题的答案Declaration of wrapper classes

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

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

不允许,但是

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

是允许的。

【问题讨论】:

因为原始类型不能null 因为整数值为空,所以总是为 0 并且永远不会为空。 (在 int 的情况下) @qqilihq :) 这就是我的问题,为什么?正如 java 包装那么为什么 java 不包装原始数据类型并允许 null 原始数据类型存储在堆栈上,而对象分配在堆上,因此一个对象可以有一个空引用。 @VineetKasat 感谢 vineet 的回复,您的回复提出了一个问题,为什么我不能为存储在堆栈中的原始数据类型设置空值,我什至可以在堆栈的值中分配空值,我正在阅读一篇文章,其中将大小小于 64 的数组存储在堆栈内存中。这意味着我还可以为存储在堆栈内存中的数据类型分配空值。 【参考方案1】:

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

此外,在您看来,null 的数值可能是什么? 0? -1?但是,这些都是有效的整数,还有什么呢?

我强烈建议您开始熟悉以下complex java tutorial. 您所询问的每个方面都在此处进行了解释并提供了示例支持。

【讨论】:

【参考方案2】:

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

【讨论】:

我可以做Byte b = null; byte b1 = b; 吗? 字节最小值 ? 当然你可以做到,但是当b被取消装箱时你会得到一个空指针。 安全方式将字节/整数转换为字节/整数?【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

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

所以默认情况下我们有,

   int a=0;

而不是

   int a=null;

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

【讨论】:

我不认为这是正确的答案,Java char 中的第一个不是 1 字节,而是出于某种特定原因,它是 2 字节,请搜索谷歌,我从未听说过关于 Java 中的 32 位和 64 位原始类型,因为这是 Java 独立于操作系统的第一个条件。 谢谢兄弟,只是解释了答案并没有想到字符内存空间,在我的脑海中是一个字符的字符串,所以它达到了1个字节。但它的 2 个字节【参考方案6】:

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

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

【讨论】:

【参考方案7】:

提到拆箱/自动装箱,您必须想象它们就像是编译器采用的两种方式来避免您因从原始到对象的连续“强制转换”而发疯,反之亦然,但它们并非完美无缺。

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

因此,为基元和对象保留不同的初始化规则是安全且合乎逻辑的。

【讨论】:

以上是关于为啥 Java 在声明原始数据类型时不允许 null [重复]的主要内容,如果未能解决你的问题,请参考以下文章

泛型(10)-泛型擦除与转换

为啥在编译时不检查 lambda 返回类型?

为啥java的一些概念需要使用包装类而不是原始数据类型[重复]

C++里面,为啥重载前++时不返回引用就不能连用?

为啥数据库或语言平台在执行查询时不返回强类型类? [关闭]

为啥 C 在使用条件运算符时不允许连接字符串?