为什么java中的数据类型不是对象?

我之前研究过java数据类型,发现它们是原始类型。 因为java是面向对象的,但它的数据类型不是。 为什么会这样?

处理原始类型比使每个变量成为完全成熟的对象更有效。 最常见的类型(即int,char,float等)是简单的原语。 其余的都是对象。

据说Java中的所有内容都是一个Object,同时Java编程语言也很简单。 由于原始数据类型消耗更少的内存并且可以更快地访问,因此它们不是对象。 等效的Wrapper类也可以在java中使用,如“Integer”,“Short”等。如果需要,它们可以用作对象。 但是,包装器类将存储在Heap中并且它们很慢。

在Java中,它的所有Object类型都可以根据基元和对象的引用来定义。

原始类型和引用是不能根据其他类型定义的类型。

一些语言所做的是隐藏区别,这有效地使基本类型更高级别,如果他们对差异不感兴趣,可以使开发人员生活更轻松,但如果他们是更难。

很少有真正的语言是纯面向对象的,纯粹的function或纯逻辑语言,你必须有许多实用的选择来使语言可用。

它是两件事的组合。

  1. 这是一种语言设计偏好/选择。 Java语言设计者清楚地认为原语与对象不同……数组类型与类不同。 在这种观点中,他们并不孤单。 许多其他OO语言设计都有这种区别。

  2. 制作原始类型(例如数字类型完整对象类型) 受到惩罚。

Jesper指出(在另一个答案的评论中)某些语言将OO数字类型映射到封面下的硬件支持类型。 但是,他没有提到只有在对它们施加限制时才能使用。 您只能对编译器已知的数字类型和叶类型执行此操作。

如果数字类型不是叶子类型,那么它可以表示为本机类型。 如果是,那么就没有办法实现这个:

class MyInteger extends Integer /* a builtin numeric type */ { public ... add(...) { /* a different way of doing addition */ } } 

为什么? 因为内置类型表示为本机硬件整数类型,并且您无法对此类表示进行调度。

简而言之,惩罚是OO数字(等)类型很慢并且使用更多等效Java原语类型的内存, 或者它们受到限制的限制,这些限制限制了您利用类型的OO-ness的能力。

性能和内存消耗是原始数据类型背后的好理由,而不是使用完整的成熟对象。