为什么原始数据类型在Java中不能为“null”?

时间:2012-06-15 08:40:40

标签: java null primitive-types

当声明任何原始类型数据(如intdouble)时,它们会初始化为00.0。为什么我们不能将它们设置为null

8 个答案:

答案 0 :(得分:52)

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

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

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

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

希望有所帮助!

答案 1 :(得分:17)

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

答案 2 :(得分:9)

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

  • 字节:java.lang.Byte
  • 短:java.lang.Short
  • int:java.lang.Integer
  • long:java.lang.Long
  • float:java.lang.Float
  • double:java.lang.Double
  • 布尔值:java.lang.Boolean
  • char java.lang.Character

如果您对整个结构感兴趣,可以启动here (Primitive Data Types)

答案 3 :(得分:5)

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

如果您希望能够通过null,则应使用the wrapper types,例如Integer代替int

答案 4 :(得分:3)

因为它是原始类型而不是对象。 如果需要能够使用空值,则可以为每种类型使用相应的对象(例如Double为double,Long为long,Boolean为布尔值等)

答案 5 :(得分:3)

对象涉及比基元更多的开销。以下测试显示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没有可空的原语。

答案 6 :(得分:1)

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

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

所以默认我们有,

   int a=0;

而不是

   int a=null;

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

答案 7 :(得分:1)

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

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

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

EX:

测试t1

测试t2

(对象包装类型)

整数i

长l

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