Java被认为是一种OOP语言,尽管它不是纯粹的OOP。 Java包含8个原语,在interview,中,James Gosling解释了原因:
Bill Venners:为什么Java中存在原始类型?为什么不呢 一切都只是一个对象?
詹姆斯·戈斯林:完全是一种效率的东西。有各种各样的 建立了整体系统的人,这些系统都是对象。 有很多方法可以做到这一点,而且所有方法都有 相当严重的问题。其中一些只是慢,因为他们 为一切分配内存。他们中的一些人试图在哪里做对象 有时他们是对象,有时他们不是(这是什么 标准的LISP系统确实),然后事情变得非常奇怪。它很好 作品,但很奇怪。
因此,内存和速度似乎都是Java原语所解决的问题。然而,这让我想知道一个语言如何才能真实,纯粹的面向对象?
如果只存在一个字节原语,你可以从那里构建。创建整数,字符,最终浮点数和双精度数。但是根本没有任何基础结构,你怎么能建造任何东西?是不是至少需要一些基本原语?换句话说,不是从?
扩展所需的基础数据结构答案 0 :(得分:5)
如果您询问是否存在无法与原始类型交互的语言,那么您可能希望查看Scala之类的内容。从该页面:
Scala是一种纯粹的面向对象语言,因为每个值都是一个对象。
然而,正如你指出的那样(对于Kotlin):
编译器在尽可能节省内存时将它们映射到JVM原语
如果您对面向对象语言的定义可能要求所有内容始终表示为对象,则纯粹面向对象的语言是不可能的。您无法构建在仅具有对象的真实计算机上运行的语言。这是因为计算机必须有一种本地表示数据的方法。这基本上是面向对象语言中的原语:底层计算机(或VM)可以表示的本机数据形式。无论你做什么,你总是需要有一些非对象的数据表示,以便计算机对它进行操作。即使您构建了一个真正将基元表示为对象的JavaScript解释器,为了添加两个整数,解释器也必须将整数加载到CPU寄存器中并使用某种形式的add
指令。
但这种解释有点忽略了面向对象编程的观点。编程语言与程序不同。语言只是我们让计算机做我们想要的工具的一种工具 - 它们实际上并不存在于运行时。你可能会说用Kotlin或Scala编写的程序比用C语言编写的程序更容易面向对象,尽管两种语言在运行时都编译成相同的汇编指令。
因此,如果您放松对纯面向对象编程的定义,而不再关心数据的运行时表示,那么您将发现纯粹的面向对象语言是可能的。编写Scala时,您永远不会与任何不是对象的东西进行交互。即使您的Int
成为'原语'在运行时,它并不重要,因为作为程序员,你从来没有真正考虑过这一点(至少在性能和记忆无关紧要的理想世界中)。 Scala的语言定义根本不包括原语的概念 - 它们是语言实现的一部分,而不是语言本身。
就Java的例子而言,Java可能不是大多数定义的纯面向对象语言。然而,它主要是面向对象的。 Java通常被称为事实上的面向对象语言,因为它比以前更加面向对象。
更进一步,面向对象这个词并不真正有definitive meaning。对于某些人而言,它可能意味着一切都必须是一个对象,而对于其他人来说,它可能仅仅意味着需要有对象,一些定义需要类的概念,一些不要等等。