52

当声明任何原始类型数据时intdouble它们会被初始化为0or 0.0。为什么我们不能将它们设置为null

4

8 回答 8

75

原始类型只是数据。另一方面,我们所说的对象只是指向数据存储位置的指针。例如:

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

在这种情况下,object它只是一个指向值恰好为 3 的 Integer 对象的指针。也就是说,在存储变量对象的内存位置,您所拥有的只是对数据实际位置的引用。number另一方面,存储的内存位置直接包含值 3。

因此,您可以将 设置object为 null,但这仅意味着该对象的数据为 null(即未分配)。您不能将 int 设置为 null,因为该语言会将其解释为值 0。

希望有帮助!

于 2012-06-15T08:43:21.677 回答
26

因为 null 是一个引用。原始类型不是引用类型。只有对象是引用类型。

于 2012-06-15T08:44:51.310 回答
14

因为Java中的原始数据类型不是Objects。您始终可以使用其中一个包装类来拥有一个Object. 八种原始数据类型中的每一种都有其对应的包装器:

  • 字节:java.lang.Byte
  • 短的:java.lang.Short
  • 诠释:java.lang.Integer
  • 长:java.lang.Long
  • 漂浮:java.lang.Float
  • 双倍的: java.lang.Double
  • 布尔值: java.lang.Boolean
  • 字符java.lang.Character

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

于 2012-06-15T08:44:29.817 回答
10

因为这就是语言标准所说的。

如果您希望能够通过null,您应该使用包装器类型,例如,Integer而不是int.

于 2012-06-15T08:42:38.837 回答
4

因为它是原始类型而不是对象。如果您需要能够使用空值(即 Double 表示双精度、Long 表示长整数、Boolean 表示布尔值等),您可以为每种类型使用相应的对象。

于 2012-06-15T08:43:46.900 回答
4

对象比原语涉及更多开销。以下测试显示 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 实现可空原语的原因,不幸的是 java 没有可空原语。

于 2015-07-15T03:33:29.867 回答
2

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

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

所以默认情况下,我们有,

   int a=0;

并不是

   int a=null;

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

于 2013-10-22T10:22:35.423 回答
1

首先,Primitive 和 Object Reference 的区别在于 Primitive 变量存储实际值,而对象引用变量存储它们所引用的对象的地址,在这种情况下,在对象引用中,如果没有地址,它将传递给“空值”。

Primitive 数据类型的默认值取决于原始数据类型:like byte = 0, short = 0, int = 0, long = 0L, float = 0.0f, double = 0.0d, boolean = false, char = "\u0000" .

当我们声明任何类类型的变量时,它被称为引用数据类型。

前任:

测试 t1

测试 t2

(对象包装类型)

整数 i

长升

对象引用默认值,Jvm 将引用变量初始化为“null”并且还将数组初始化为“null”

于 2016-04-07T22:54:32.147 回答