【发布时间】:2012-06-18 07:45:15
【问题描述】:
当声明任何原始类型数据时,如int 或double,它们会被初始化为0 或0.0。为什么我们不能将它们设置为null?
【问题讨论】:
标签: java null primitive-types
当声明任何原始类型数据时,如int 或double,它们会被初始化为0 或0.0。为什么我们不能将它们设置为null?
【问题讨论】:
标签: java null primitive-types
因为 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
如果您对整个结构感兴趣,可以开始here (Primitive Data Types)。
【讨论】:
对象比原语涉及更多的开销。以下测试显示 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 没有可空原语。
【讨论】:
首先,Primitive 和 Object Reference 的区别在于 Primitive 变量存储的是实际值,而对象引用变量存储了它们所引用的对象的地址,在这种情况下,在对象引用中,如果没有地址,它将传递给“null”。
原始数据类型的默认值取决于原始数据类型: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”
【讨论】:
除了以上所有答案,我也想补充一点。
对于原始类型,我们有固定的内存大小,即对于 int 我们有 4 个字节,对于 char 我们有 2 个字节。 null 仅用于对象,因为内存大小不固定。
所以默认情况下我们有,
int a=0;
而不是
int a=null;
与其他原始类型相同,因此 null 仅用于对象而不用于原始类型。
【讨论】:
因为 null 是一个引用。原始类型不是引用类型。只有对象是引用类型。
【讨论】:
因为它是原始类型而不是对象。 如果您需要能够使用空值(即 Double 表示双精度、Long 表示长整数、Boolean 表示布尔值等),您可以为每种类型使用相应的对象
【讨论】:
原始类型只是数据。另一方面,我们所说的对象只是指向数据存储位置的指针。例如:
Integer object = new Integer(3);
int number = 3;
在这种情况下,object 只是一个指向 Integer 对象的指针,它的值恰好是 3。也就是说,在存储变量对象的内存位置,你所拥有的只是对数据真正位置的引用是。而存储number的内存位置则直接包含值3。
因此,您可以将object 设置为null,但这只是意味着该对象的数据为null(即未分配)。您不能将 int 设置为 null,因为语言会将其解释为值 0。
希望有帮助!
【讨论】:
因为这是语言标准所说的。
如果你想能够通过null,你应该使用the wrapper types,例如Integer 而不是 int。
【讨论】: