c语言 如何创建adt_编程那些事儿:面向对象编程基石之数据抽象(ADT)
數(shù)據(jù)抽象
本文接上一篇《編程那些事兒:為什么說抽象是面向?qū)ο缶幊痰母?】?》,
在了解了面向?qū)ο缶幊坛橄蟮?strong>過程抽象后,下面我們繼續(xù)聊一下數(shù)據(jù)抽象。
數(shù)據(jù)抽象可以說面向?qū)ο缶幊套钪匾幕6鴶?shù)據(jù)抽象的結(jié)果就是數(shù)據(jù)類型(或簡(jiǎn)單的類型),它一般由以下三個(gè)部分定義:
- 一組值(或數(shù)據(jù)對(duì)象)。
- 一組操作,可應(yīng)用于該集合中的所有值。
- 一種數(shù)據(jù)表示,它決定如何存儲(chǔ)值。
通常編程語言會(huì)提供一些預(yù)定義的數(shù)據(jù)類型,稱為內(nèi)置數(shù)據(jù)類型。
他們也允許程序開發(fā)人員定義自己的數(shù)據(jù)類型,這被稱為用戶定義的數(shù)據(jù)類型。
由原子值和不可分割值組成的數(shù)據(jù)類型稱為原始數(shù)據(jù)類型,它的定義不需要任何其他數(shù)據(jù)類型的幫助。例如,Java具有內(nèi)置的基元數(shù)據(jù)類型,比如int, float, boolean, char等。
按照數(shù)據(jù)抽象的組成結(jié)構(gòu),Java中定義int基元數(shù)據(jù)類型的三個(gè)組成部分如下:
- 值:int數(shù)據(jù)類型由-2147483648和2147483647之間的所有整數(shù)組成。
- 操作:為int數(shù)據(jù)類型定義了加法、減法、乘法、除法、比較等操作。
- 數(shù)據(jù)表示:int數(shù)據(jù)類型的值以2的補(bǔ)碼形式在32位內(nèi)存中表示。
int數(shù)據(jù)類型的所有三個(gè)組件都是由Java語言預(yù)定義的。開發(fā)人員不能擴(kuò)展或重新定義int數(shù)據(jù)類型的定義。
我們具體拿int 類型看一下它的抽象內(nèi)容,比如:
int i;該語句說 i 是一個(gè)名稱(技術(shù)上稱為標(biāo)識(shí)符),可以與定義int數(shù)據(jù)類型值的一組值中的一個(gè)值關(guān)聯(lián)。
例如,可以使用下面的賦值語句將整數(shù)100與名稱i關(guān)聯(lián):
i = 100;在此階段,您可能會(huì)問,“與i關(guān)聯(lián)的值100存儲(chǔ)在內(nèi)存中何處?” 根據(jù)int數(shù)據(jù)類型的定義,i將占用32位內(nèi)存。
但是,您不知道,不能知道,也不需要知道在內(nèi)存中為i分配32位空間的位置,這樣做也是一種抽象。在像Java這種高級(jí)語言中,像這樣的抽象的例子比比皆是。
面向?qū)ο缶幊陶Z言
在本例中,關(guān)于int數(shù)據(jù)類型的數(shù)據(jù)值的數(shù)據(jù)表示內(nèi)存形式對(duì)數(shù)據(jù)類型的用戶(程序員)來說是隱藏的。
換句話說,程序員會(huì)忽略i的內(nèi)存位置,而專注于它的值和可以在其上執(zhí)行的操作。
程序員并不關(guān)心i的內(nèi)存是分配在寄存器、RAM還是硬盤中。
面向?qū)ο蟮木幊陶Z言(如Java)允許我們使用抽象機(jī)制創(chuàng)建新的數(shù)據(jù)類型稱為數(shù)據(jù)抽象。
以此創(chuàng)建的新的數(shù)據(jù)類型被稱為抽象數(shù)據(jù)類型(ADT)。
ADT的數(shù)據(jù)對(duì)象可能包括原始數(shù)據(jù)類型和其他ADT的組合,ADT定義了一組可以應(yīng)用于其所有數(shù)據(jù)對(duì)象的操作,但其數(shù)據(jù)表示卻總是隱藏在ADT中。
對(duì)于ADT的用戶來說,他們只知道如何操作該數(shù)據(jù),只能使用這些操作來處理它的數(shù)據(jù)元素。
使用數(shù)據(jù)抽象的好處是,它的數(shù)據(jù)表示可以在不影響使用ADT的任何代碼的情況下進(jìn)行更改。
總結(jié)一下,數(shù)據(jù)抽象允許程序員創(chuàng)建一個(gè)稱為抽象數(shù)據(jù)類型的新數(shù)據(jù)類型,其中數(shù)據(jù)對(duì)象的存儲(chǔ)表示形式對(duì)數(shù)據(jù)類型的用戶是隱藏的。
換句話說,ADT僅僅是根據(jù)可以應(yīng)用于其類型的數(shù)據(jù)對(duì)象的操作來定義的,而不需要知道數(shù)據(jù)的內(nèi)部表示形式。
這種數(shù)據(jù)類型之所以稱為抽象,是因?yàn)锳DT的用戶從來沒有看到過數(shù)據(jù)值的表示。
用戶以抽象的方式查看ADT的數(shù)據(jù)對(duì)象,方法是在不了解數(shù)據(jù)對(duì)象表示細(xì)節(jié)的情況下對(duì)它們應(yīng)用操作。
當(dāng)然,ADT并不意味著數(shù)據(jù)類型構(gòu)成中沒有數(shù)據(jù)表示。數(shù)據(jù)表示在ADT中是肯定存在的,只是對(duì)用戶隱藏了數(shù)據(jù)表示而已。
Java有一些數(shù)據(jù)結(jié)構(gòu)構(gòu)造,比如類、接口、注釋和枚舉,這些構(gòu)造都允許我們用它來定義新的ADT。
注意在我們使用一個(gè)類來定義一個(gè)新的ADT時(shí),需要小心地隱藏?cái)?shù)據(jù)表示,這樣我們的新數(shù)據(jù)類型就真的是抽象的了。
如果我們Java類中的沒有隱藏?cái)?shù)據(jù)表示,該類將創(chuàng)建一個(gè)新的數(shù)據(jù)類型,而不再是ADT。
Java中的類提供了一些特性,我們可以使用這些特性公開或隱藏?cái)?shù)據(jù)表示。
數(shù)據(jù)抽象編碼
在Java語言中,我們拿類Class這個(gè)抽象數(shù)據(jù)類型來看它的三個(gè)組成部分:
其中數(shù)據(jù)類型是Object,其操作方法是methods,數(shù)據(jù)類型的表示就是我們的定義的私有字段。
我們可以通過Class中定義的方法來實(shí)現(xiàn)對(duì)字段(數(shù)據(jù)表示)的操作。
在Java語言中,有一個(gè)純種的ADT,那就是接口(interface),它只提供了數(shù)據(jù)的操作部分,而沒有具體的實(shí)現(xiàn)。
而它的數(shù)據(jù)值部分和數(shù)據(jù)表示部分都是實(shí)現(xiàn)它的具體類提供的。
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類。通過定義一個(gè)名為Person的類,我們就創(chuàng)建了一個(gè)新的ADT。
我們定義內(nèi)部屬性name和gender就是其內(nèi)部數(shù)據(jù)表示,它們使用String數(shù)據(jù)類型(String是Java類庫(kù)提供的內(nèi)置ADT)。
我們可以注意到,Person類的定義在name和gender聲明中使用private關(guān)鍵字來隱藏它。所以Person類的用戶不能訪問name和gender數(shù)據(jù)元素。
它提供了四個(gè)操作:一個(gè)構(gòu)造函數(shù)和三個(gè)方法(getName、setName和getGender)。
構(gòu)造函數(shù)操作用于初始化新構(gòu)造的Person類型的數(shù)據(jù)對(duì)象。getName和setName操作分別用于訪問和修改name數(shù)據(jù)元素。
getGender操作用于訪問性別數(shù)據(jù)元素的值。
Person類的用戶只能使用這四個(gè)操作來處理Person類型的數(shù)據(jù)對(duì)象。
Person類型的用戶不知道用于存儲(chǔ)name和gender數(shù)據(jù)元素的數(shù)據(jù)存儲(chǔ)類型。
我上面使用了三個(gè)詞,“數(shù)據(jù)類型”、“類”和“接口”,其實(shí)在某種意義上說,它們可以互換使用,因?yàn)樗鼈冊(cè)跀?shù)據(jù)類型上下文中的意思是相同的。
它讓Person類型的開發(fā)人員可以自由地更改name和gender數(shù)據(jù)元素的數(shù)據(jù)表示形式,而不會(huì)影響任何Person類型的用戶。
假設(shè)其中一個(gè)Person類型的用戶有以下代碼片段:
Person john = new Person("Si Li總結(jié)
以上是生活随笔為你收集整理的c语言 如何创建adt_编程那些事儿:面向对象编程基石之数据抽象(ADT)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 伊利回应30支冰糕分30箱发货 被网友吐
- 下一篇: 早报:荣耀Magic5系列新机入网 美国