12

可能重复:
当我们有包装类时,为什么支持原语?

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

4

3 回答 3

30

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

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

然而,这并不能解释为什么原始类型需要在 Java 编程语言中显式可见。Java 语言和 JVM 的设计者可以选择对语言本身隐藏原始类型,这样您就可以将一切都视为对象;然后,编译器可以在幕后将其转换为更有效的原始类型。

Some newer programming languages that run on the JVM (Groovy, Scala and others) let you do exactly that: in the language itself everything looks like an object, which you can for example call methods on, but below the covers the compiler translates them to primitives.

I guess that in the time the Java language was developed (in the first half of the 1990's) people didn't think of that, and now it's too late for a radical change in the language to allow this.

于 2013-01-23T10:53:09.960 回答
6

存在原始数据类型的主要原因是,创建对象、分配堆的成本太高,并且会降低性能。您可能知道 int、float 等原始数据类型是最常用的,因此将它们作为对象会极大地影响性能。所以 Java 设计者认为最好把它做成非对象。是的,如果你准备在性能上妥协一点,但你需要更多的 OOP 设施,包装器就存在。因此,在这种情况下,您可以使用包装器。希望这些信息对您有所帮助。

于 2013-01-23T10:51:40.937 回答
2

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

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

于 2013-01-23T10:52:01.117 回答