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