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

MBM*_*BMJ 39 java null primitive-types

在声明任何原始类型数据时,int或者将double它们初始化为00.0.我们为什么不设置它们null

Miq*_*uel 59

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

Integer object = new Integer(3);
int number = 3;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,object仅仅是一个指向整数对象,其值正好是3.也就是,在其中变量对象存储在内存中的位置,你已经是到数据真的是一个参考.number另一方面,存储的存储位置直接包含值3.

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

希望有所帮助!


Pol*_*ome 20

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


bri*_*ium 10

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

  • 字节: java.lang.Byte
  • 短: java.lang.Short
  • INT: java.lang.Integer
  • 长: java.lang.Long
  • 浮动: java.lang.Float
  • 双: java.lang.Double
  • 布尔: java.lang.Boolean
  • 烧焦 java.lang.Character

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


Oli*_*rth 5

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

如果您希望能够通过null,则应使用包装类型,例如Integer代替int.


Chr*_*ris 5

对象比基元涉及更多的开销。以下测试显示 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());
Run Code Online (Sandbox Code Playgroud)

这就是 .net 实现 nullable 原语的原因,不幸的是 java 没有 nullable 原语。