为什么Java中的基本数据类型不能为“null”?

vql8enpb  于 2022-12-25  发布在  Java
关注(0)|答案(8)|浏览(438)

当声明intdouble等基元类型数据时,它们会被初始化为00.0。为什么我们不能将它们设置为null

pbossiut

pbossiut1#

一个基本类型就是数据。另一方面,我们称之为对象的东西只是指向数据存储位置的指针。例如:

Integer object = new Integer(3);
int number = 3;

在本例中,object只是一个指向Integer对象的指针,该对象的值恰好为3。也就是说,在存储变量对象的内存位置,您所拥有的只是对数据实际位置的引用。另一方面,存储number的内存位置直接包含值3。
因此,可以将object设置为null,但这只意味着该对象的数据为null(即未赋值),而不能将int设置为null,因为语言会将其解释为值0。

70gysomp

70gysomp2#

因为null是一个引用。而基元类型不是引用类型。只有对象才是引用类型。

0lvr5msh

0lvr5msh3#

因为Java中的基元数据类型不是Object,所以你可以使用其中一个 Package 器类来拥有一个Object,八种基元数据类型中的每一种都有其对应的 Package 器:

  • 字节:java.lang.Byte
  • 短:java.lang.Short
  • 整数:java.lang.Integer
  • 长:java.lang.Long
  • 浮动:java.lang.Float
  • 双精度:java.lang.Double
  • 布尔值:java.lang.Boolean
  • 字符java.lang.Character

如果您对整个结构感兴趣,可以从here (Primitive Data Types)开始。

7gs2gvoe

7gs2gvoe4#

因为语言标准是这么说的。
如果你希望能够传递null,你应该使用the wrapper types,例如Integer而不是int

vwoqyblh

vwoqyblh5#

对象的开销比基元的大。下面的测试显示int的执行速度比Integer快10倍。

int n;
EtmPoint point1 = etmMonitor.createPoint("test:objects");
for (n = 0; n < 1000000; n++) {
    Integer t = 0;
    t = 10;
    t = 11;
}

point1.collect();
EtmPoint point = etmMonitor.createPoint("test:primitives");
for (n = 0; n < 1000000; n++) {
    int t = 0;
    t = 10;
    t = 11;
}
point.collect();

etmMonitor.render(new SimpleTextRenderer());

这就是为什么.net实现了nullable原语,不幸的是java没有nullable原语。

nr9pn0ug

nr9pn0ug6#

因为它是一个基本类型而不是一个对象。如果你需要使用空值的能力,你可以为每一个类型使用相应的对象(例如Double代表double,Long代表long,Boolean代表boolean,等等)。

7eumitmz

7eumitmz7#

沿着以上所有的回答,我还想补充这一点。
对于原语类型,我们有固定的内存大小,例如int类型有4个字节,char类型有2个字节,null只用于对象,因为对象的内存大小不是固定的。
所以默认情况下,

int a=0;

而不是

int a=null;

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

ogq8wdun

ogq8wdun8#

首先,原语和对象引用的区别是原语变量存储实际值,而对象引用变量存储它们所引用的对象的地址,在这种情况下,在对象引用中,如果没有地址,它将传递给"null"。
原语数据类型的默认值取决于原语数据类型:例如字节= 0、短整型= 0、整型= 0、长整型= 0L、浮点型= 0.0f、双精度型= 0.0d、布尔型=假、字符型="\u0000"。
当我们声明一个任何类类型的变量时,它被称为引用数据类型。
例如:
测试t1
测试t2
(对象封套类型)
整数i
长l
对象引用默认值,JVM将引用变量初始化为"null",也将数组初始化为"null"

相关问题