繁体   English   中英

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

[英]Why can't primitive data types be “null” in Java?

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

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

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

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

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

希望有所帮助!

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

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

  • byte: java.lang.Byte
  • short: java.lang.Short
  • int: java.lang.Integer
  • long: java.lang.Long
  • float: java.lang.Float
  • double: java.lang.Double
  • boolean: java.lang.Boolean
  • char java.lang.Character

如果您对整个结构感兴趣,可以从这里开始(原始数据类型)

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

如果您希望能够传递null ,则应使用包装器类型 ,例如Integer而不是int

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

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

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

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

所以默认我们有,

   int a=0;

并不是

   int a=null;

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

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

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

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

EX:

测试t1

测试t2

(对象包装类型)

整数我

长l

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM