c语言 如何创建adt_编程那些事儿:面向对象编程基石之数据抽象(ADT)
數據抽象
本文接上一篇《編程那些事兒:為什么說抽象是面向對象編程的根基【1】?》,
在了解了面向對象編程抽象的過程抽象后,下面我們繼續聊一下數據抽象。
數據抽象可以說面向對象編程最重要的基石。而數據抽象的結果就是數據類型(或簡單的類型),它一般由以下三個部分定義:
- 一組值(或數據對象)。
- 一組操作,可應用于該集合中的所有值。
- 一種數據表示,它決定如何存儲值。
通常編程語言會提供一些預定義的數據類型,稱為內置數據類型。
他們也允許程序開發人員定義自己的數據類型,這被稱為用戶定義的數據類型。
由原子值和不可分割值組成的數據類型稱為原始數據類型,它的定義不需要任何其他數據類型的幫助。例如,Java具有內置的基元數據類型,比如int, float, boolean, char等。
按照數據抽象的組成結構,Java中定義int基元數據類型的三個組成部分如下:
- 值:int數據類型由-2147483648和2147483647之間的所有整數組成。
- 操作:為int數據類型定義了加法、減法、乘法、除法、比較等操作。
- 數據表示:int數據類型的值以2的補碼形式在32位內存中表示。
int數據類型的所有三個組件都是由Java語言預定義的。開發人員不能擴展或重新定義int數據類型的定義。
我們具體拿int 類型看一下它的抽象內容,比如:
int i;該語句說 i 是一個名稱(技術上稱為標識符),可以與定義int數據類型值的一組值中的一個值關聯。
例如,可以使用下面的賦值語句將整數100與名稱i關聯:
i = 100;在此階段,您可能會問,“與i關聯的值100存儲在內存中何處?” 根據int數據類型的定義,i將占用32位內存。
但是,您不知道,不能知道,也不需要知道在內存中為i分配32位空間的位置,這樣做也是一種抽象。在像Java這種高級語言中,像這樣的抽象的例子比比皆是。
面向對象編程語言
在本例中,關于int數據類型的數據值的數據表示內存形式對數據類型的用戶(程序員)來說是隱藏的。
換句話說,程序員會忽略i的內存位置,而專注于它的值和可以在其上執行的操作。
程序員并不關心i的內存是分配在寄存器、RAM還是硬盤中。
面向對象的編程語言(如Java)允許我們使用抽象機制創建新的數據類型稱為數據抽象。
以此創建的新的數據類型被稱為抽象數據類型(ADT)。
ADT的數據對象可能包括原始數據類型和其他ADT的組合,ADT定義了一組可以應用于其所有數據對象的操作,但其數據表示卻總是隱藏在ADT中。
對于ADT的用戶來說,他們只知道如何操作該數據,只能使用這些操作來處理它的數據元素。
使用數據抽象的好處是,它的數據表示可以在不影響使用ADT的任何代碼的情況下進行更改。
總結一下,數據抽象允許程序員創建一個稱為抽象數據類型的新數據類型,其中數據對象的存儲表示形式對數據類型的用戶是隱藏的。
換句話說,ADT僅僅是根據可以應用于其類型的數據對象的操作來定義的,而不需要知道數據的內部表示形式。
這種數據類型之所以稱為抽象,是因為ADT的用戶從來沒有看到過數據值的表示。
用戶以抽象的方式查看ADT的數據對象,方法是在不了解數據對象表示細節的情況下對它們應用操作。
當然,ADT并不意味著數據類型構成中沒有數據表示。數據表示在ADT中是肯定存在的,只是對用戶隱藏了數據表示而已。
Java有一些數據結構構造,比如類、接口、注釋和枚舉,這些構造都允許我們用它來定義新的ADT。
注意在我們使用一個類來定義一個新的ADT時,需要小心地隱藏數據表示,這樣我們的新數據類型就真的是抽象的了。
如果我們Java類中的沒有隱藏數據表示,該類將創建一個新的數據類型,而不再是ADT。
Java中的類提供了一些特性,我們可以使用這些特性公開或隱藏數據表示。
數據抽象編碼
在Java語言中,我們拿類Class這個抽象數據類型來看它的三個組成部分:
其中數據類型是Object,其操作方法是methods,數據類型的表示就是我們的定義的私有字段。
我們可以通過Class中定義的方法來實現對字段(數據表示)的操作。
在Java語言中,有一個純種的ADT,那就是接口(interface),它只提供了數據的操作部分,而沒有具體的實現。
而它的數據值部分和數據表示部分都是實現它的具體類提供的。
public class Person{private String name;private String gender;public Person(String name, String gender){this.name = name;this.gender = gender;}public String getName(){return name;}public void setName(String name){this.name = name;}public String getGender(){return gender;}}比如:使用Java語言語法定義Person類。通過定義一個名為Person的類,我們就創建了一個新的ADT。
我們定義內部屬性name和gender就是其內部數據表示,它們使用String數據類型(String是Java類庫提供的內置ADT)。
我們可以注意到,Person類的定義在name和gender聲明中使用private關鍵字來隱藏它。所以Person類的用戶不能訪問name和gender數據元素。
它提供了四個操作:一個構造函數和三個方法(getName、setName和getGender)。
構造函數操作用于初始化新構造的Person類型的數據對象。getName和setName操作分別用于訪問和修改name數據元素。
getGender操作用于訪問性別數據元素的值。
Person類的用戶只能使用這四個操作來處理Person類型的數據對象。
Person類型的用戶不知道用于存儲name和gender數據元素的數據存儲類型。
我上面使用了三個詞,“數據類型”、“類”和“接口”,其實在某種意義上說,它們可以互換使用,因為它們在數據類型上下文中的意思是相同的。
它讓Person類型的開發人員可以自由地更改name和gender數據元素的數據表示形式,而不會影響任何Person類型的用戶。
假設其中一個Person類型的用戶有以下代碼片段:
Person john = new Person("Si Li總結
以上是生活随笔為你收集整理的c语言 如何创建adt_编程那些事儿:面向对象编程基石之数据抽象(ADT)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 伊利回应30支冰糕分30箱发货 被网友吐
- 下一篇: 取pi的前8位的解压密码_两种方式实现取