2013-01-23 75 views
3

Possible Duplicate:
When we have wrappers classes, why primitives are supported?为什么Java中有原始数据类型?

如果有使Wrapper类成为纯粹的面向对象语言的Wrapper类,那么为什么有可以在Java中使用的Primitive数据类型?

+0

这里检查http://stackoverflow.com/questions/6151497/why-java-is-not-pure-object-oriented-language – PermGenError

+0

@GanGnaMStYleOverFlowErroR:它不能解释*为什么*有原始类型。 –

+2

有[传言说Java 10中的原语会消失](http://java.dzone.com/articles/oracle-discusses-features-java)。 – assylias

回答

9

提高效率。原始类型的变量直接包含该值;非原始类型的变量是引用,指的是存储在其他地方的对象。

每次您需要使用包装类型的值时,JVM都需要查找内存中的对象以获取该值。原始类型不需要这样做,因为变量包含值本身,而不是包含该值的对象的引用。

但是,这并不能解释为什么原始类型需要在Java编程语言中显式可见。 Java语言和JVM的设计者可以选择从语言本身隐藏基本类型,这样你就可以将所有东西当作一个对象来处理;编译器可以将其翻译成更高效的原始类型。运行在JVM上的一些较新的编程语言(Groovy,Scala和其他)可以让你做到这一点:在语言本身中,一切看起来像一个对象,你可以调用方法,但在下面覆盖编译器将它们转换为基元。

我想在开发Java语言的时候(在20世纪90年代的前半期)人们没有想到这一点,现在为了做到这一点,对语言进行彻底改变已经太晚了。

3

原始数据类型存在的主要原因是因为创建对象,分配堆太昂贵并且存在性能损失。正如你可能知道像int这样的基本数据类型,float等是最常用的,所以将它们作为对象会产生巨大的性能影响。所以Java设计者认为将它作为非对象会更好。 是的,包装存在的情况下,你准备妥协一点性能,但你需要更多的设施的OOP。所以在这种情况下,你可以使用包装器。希望这些信息可以帮助你。

+0

*创建对象,分配堆太昂贵,并有性能损失* =>你有参考吗?有一个惩罚,但并不是那么高。 – assylias

+0

例如,[Goetz states](http://www.ibm.com/developerworks/java/library/j-jtp09275/index.html)* HotSpot 1.4.2及更高版本中新对象()的通用代码路径大约有10条机器指令*。 – assylias

+0

_原始类型代表单个值 - 不是复杂的对象。尽管Java是 否则完全是面向对象的,但是基本类型不是。它们类似于 这些简单的类型,在大多数其他非面向对象的语言中都可以找到。原因是 效率。将基本类型变为对象会使Java的性能退化,成为完整的参考。 –

2

由于性能原因。在像SmallTalk之类的其他语言中,像int或char这样的类型也是对象,并且可以在它们上调用方法。这在理论上更加正确,但当前的实现运行速度较慢。原始类型在纯度和性能之间折衷。

如果需要更多(空值可能或与集合框架一起使用),Java提供包装类,如java.lang.Integer和类似的。

相关问题