java.lang.Integer 不是原始类型。它是一个包装原始 java 类型 int 的 ADT。其他 Java 基本类型和相应的包装器也是如此。
您不需要语言中的 OOP 支持即可拥有 ADT。如果您没有支持,则在您编写的代码中为 ADT 建立约定(即,您仅将其用作由 ADT 的操作和可能值定义的先前定义)
这就是为什么 ADT 早于 OOP 语言中的类和对象概念。它们之前就存在。 class 之类的语句刚刚在语言中引入了直接支持,允许编译器检查您使用 ADT 所做的工作。
原始类型只是可以存储在内存中的值,没有任何其他相关代码。他们不了解自己或他们的运作。与 ADT 不同,它们的内部表示为外部参与者所知。就像可能的操作一样。这些是从外部对值进行的操作。
原始类型带有与 CPU 或虚拟机架构相关的实现细节,尽管您不需要看到它。因为它们映射到 CPU 可用的寄存器大小和 CPU 直接执行的指令。因此,例如最大整数值限制。
如果允许我这么说,硬件知道你的原始类型。
所以你的非抽象数据类型是一种语言的原始类型,
如果这些类型本身也不是 ADT。如果他们碰巧是 ADT,
您可能必须创建它们(不仅仅是声明它们;会有
是代码在内存中设置事物,而不仅仅是某个特定的存储
地址),所以他们有一个身份,他们通常提供方法
通过该身份调用,也就是说,他们了解自己。
因为在某些语言中一切都是对象,就像在 Python 中一样,
内置类型(那些很容易获得的,没有
需要定义类)有时也被称为原始的,尽管
根据上述定义,根本不是原始的。
编辑:
正如 jaco0646 所提到的,还有更多关于具体/抽象的内容
OOP 中的单词。
ADT 已经是一种抽象。它代表一个类别
您可以从中实例化的类似对象。
但是 ADT 可以更加抽象,并且被称为(如
反对具体的数据类型),如果您声明它无意
从中实例化对象。通常你这样做是因为其他“具体”
ADT(您实例化的)继承自“抽象”ADT。这允许在几个不同的 ADT 之间共享和扩展行为。
例如,您可以定义一个这样的 API,并制作一个或多个不同的
ADT 仅通过继承向其用户提供(并尊重)该 API。
抽象的 ADT 可能由您定义或以语言类型提供,或
图书馆。
例如,Python 内置 list 对象也是 collections.abc.Iterable。
在 Python 中,您可以使用多重继承来添加类似的功能。
虽然还有其他方法。
在 Java 中你不能,但是你有接口,并且可以声明一个 class 来实现一个或多个接口,除了可能扩展另一个类。
因此,目的是直接实例化的 ADT 定义是
混凝土 ADT。否则它是抽象的。
一个密切相关的概念是类中的抽象方法。
这是一个不用代码填充的方法,因为它是由应该实现它的子类填充的,尊重它的签名(名称和参数)。
因此,根据您的语言,您会发现实现这些概念的可能不同(或相似)方式。