当声明任何原始类型数据(如int
或double
)时,它们会初始化为0
或0.0
。为什么我们不能将它们设置为null
?
答案 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
java.lang.Integer
java.lang.Long
java.lang.Float
java.lang.Double
java.lang.Boolean
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”