抽象数据类型与非抽象数据类型(Java)

Abstract Data Type vs. non Abstract Data Types (in Java)

我已经阅读了很多关于抽象数据类型 (ADT) 的文章,我在问自己是否有非抽象/具体的数据类型?

SO 上已经有一个关于 ADT 的 question,但是这个问题不涉及 "non-abstract" 数据类型。

The definition of ADT only mentions what operations are to be performed but not how these operations will be implemented

reference

所以 ADT 对用户隐藏了具体的实现,"only" 提供了一堆允许的操作/方法;例如,Java (reference) 中的堆栈。只有pop()push()empty()等方法可见,具体实现隐藏

根据这个论证,我想到了一个问题,是否存在 "non-abstract" 数据类型?

即使像 java.lang.Integer 这样的原始数据类型也有定义明确的操作,例如 +-、...根据维基百科,它是一个 ADT。

For example, integers are an ADT, defined as the values …, −2, −1, 0, 1, 2, …, and by the operations of addition, subtraction, multiplication, and division, together with greater than, less than, etc.,

reference

java.lang.Integer 不是原始类型。它是一个包装原始 java 类型 int 的 ADT。其他 Java 原始类型和相应的包装器也是如此。

您不需要语言中的 OOP 支持来拥有 ADT。如果您没有支持,请在您编写的代码中为 ADT 建立约定(即,您仅将其用作由 ADT 的操作和可能值定义的先前定义)

这就是为什么 ADT 早于 class 而对象概念出现在 OOP languages.They 之前。 class 之类的语句刚刚在语言中引入了直接支持,允许编译器检查您在使用 ADT 做什么。

原始类型只是可以存储在内存中的值,没有任何其他关联代码。他们不了解自己或他们的操作。与 ADT 不同,它们的内部表示为外部参与者所知。就像可能的操作一样。这些是从外部对值进行的操作。

原始类型带有与 CPU 或虚拟机架构相关的实现细节,尽管您不一定要看到它。因为它们映射到 CPU 可用的寄存器大小和 CPU 直接执行的指令。因此,例如最大整数值限制。

如果允许我这么说,硬件知道你的原始类型。

所以你的非抽象数据类型是语言的原始类型, 如果这些类型本身也不是 ADT。如果他们碰巧是 ADT, 您可能必须创建它们(不只是声明它们;会有 是代码在内存中设置东西,而不仅仅是某个特定的存储 地址),所以他们有一个身份,他们通常提供方法 通过该身份调用,也就是说,他们了解自己。

因为在某些语言中一切都是对象,例如 Python, 内置类型(无需 需要定义 classes) 有时也被称为原始的,尽管 根据上述定义,根本不是原始的。

编辑:

正如jaco0646所提到的,还有更多关于concrete/abstract OOP 中的单词。

ADT 已经是一种抽象。它代表一个类别 您可以从中实例化的类似对象。

但是 ADT 可以更抽象,并且被这样引用(如 反对具体的数据类型)如果你声明它无意 从中实例化对象。通常你这样做是因为其他 "concrete" ADT(您实例化的那些)继承自 "abstract" ADT。这允许在几个不同的 ADT 之间共享和扩展行为。 例如,你可以定义一个 API 这样的,并使一个或多个不同 ADT 仅通过继承向其用户提供(并尊重)API。

抽象 ADT 可能由您定义或以语言类型提供或 图书馆。

例如 Python 内置 list 对象也是 collections.abc.Iterable.

在 Python 中,您可以使用多重继承来添加类似的功能。 虽然还有其他方法。

在 Java 中你不能,但是你有接口,并且可以声明一个 class 来实现一个或多个接口,除了可能扩展另一个 class.

所以一个目的是直接实例化的ADT定义是一个 具体的ADT。否则就是抽象的。

一个密切相关的概念是 class 中的抽象方法。 这是一种您不需要用代码填充的方法,因为它应该由应该实现它的子 classes 填充,尊重它的签名(名称和参数)。

因此,根据您使用的语言,您会发现实现此概念的可能不同(或相似)的方式。

我同意@progmatico 的回答,但我要补充一点,具体(非抽象)数据类型包括的不仅仅是基元。

在Java中,Stack恰好是一个具体数据类型,它扩展了另一个具体数据类型Vector,它扩展了一个ADTAbstractList.

AbstractList实现的接口也是ADT:IterableCollectionList.