c语言 如何创建adt_编程那些事儿:面向对象编程基石之数据抽象(ADT)

871b47950488811198ad7a2cd0238b2b.png

数据抽象

本文接上一篇《编程那些事儿:为什么说抽象是面向对象编程的根基【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这种高级语言中,像这样的抽象的例子比比皆是。

eb5e67c2abb19632d13d7756e784a0ff.png

面向对象编程语言

在本例中,关于int数据类型的数据值的数据表示内存形式对数据类型的用户(程序员)来说是隐藏的。

换句话说,程序员会忽略i的内存位置,而专注于它的值和可以在其上执行的操作。

程序员并不关心i的内存是分配在寄存器、RAM还是硬盘中。

面向对象的编程语言(如Java)允许我们使用抽象机制创建新的数据类型称为数据抽象。

以此创建的新的数据类型被称为抽象数据类型(ADT)

ADT的数据对象可能包括原始数据类型和其他ADT的组合,ADT定义了一组可以应用于其所有数据对象的操作,但其数据表示却总是隐藏在ADT中。

对于ADT的用户来说,他们只知道如何操作该数据,只能使用这些操作来处理它的数据元素。

使用数据抽象的好处是,它的数据表示可以在不影响使用ADT的任何代码的情况下进行更改。

总结一下,数据抽象允许程序员创建一个称为抽象数据类型的新数据类型,其中数据对象的存储表示形式对数据类型的用户是隐藏的。

换句话说,ADT仅仅是根据可以应用于其类型的数据对象的操作来定义的,而不需要知道数据的内部表示形式。

这种数据类型之所以称为抽象,是因为ADT的用户从来没有看到过数据值的表示。

用户以抽象的方式查看ADT的数据对象,方法是在不了解数据对象表示细节的情况下对它们应用操作。

当然,ADT并不意味着数据类型构成中没有数据表示。数据表示在ADT中是肯定存在的,只是对用户隐藏了数据表示而已。

Java有一些数据结构构造,比如类、接口、注释和枚举,这些构造都允许我们用它来定义新的ADT。

注意在我们使用一个类来定义一个新的ADT时,需要小心地隐藏数据表示,这样我们的新数据类型就真的是抽象的了。

如果我们Java类中的没有隐藏数据表示,该类将创建一个新的数据类型,而不再是ADT。

Java中的类提供了一些特性,我们可以使用这些特性公开或隐藏数据表示。

cefdbedce7335706a3235031a3e13c89.png

数据抽象编码

在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql客户端版本太低_windows一机多装mysql,5.5低版本+5.8高版本

安装第一个mysql,压缩版或者安装版,过程省略,目录如下:运行中输入“regedit”进入后,找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL其实mysql启动的路径一般为:可执行文件的路径&…

java8 list 行转列_Java14 都来了,你还不会用 Java8吗?

Java 8 于2014年3月18日发布,并且成为主流的 Java,如今,虽然 Java 14 都已经发布了,但是 开发者和公司选择的版本依旧是经久不衰的 Java 8 版本,如果你还不了解这些新特性,是时候学习一下了。Java 8 更新的…

mysql主键用完了怎么办_MySQL 自增 ID 用完了怎么办?

MySQL 自增 ID 用完了怎么办?在MySQL中有很多类型的自增ID,每个自增ID都设置了初始值,然后按照一定的步长增加,只要定义了字节长度,那么就会有上限,如果达到上限再次添加,则会报主键冲突错误&am…

python怎么引用多行输入_python调用shell返回两行第二行需要输入密码怎么办?import os os.syst...

没有办法交互,用ftplib吧 # 例:FTP编程 from ftplib import FTP ftp FTP() timeout 30 port 21 ftp.connect(192.168.1.188,port,timeout) # 连接FTP服务器 ftp.login(UserName,888888) # 登录 print ftp.getwelcome() # 获得欢迎信息 ftp.cwd(file/t…

java rsa_java中RSA加解密的实现

public static void main(String[] args) throws Exception {// TODO Auto-generated method stubHashMap map RSAUtils.getKeys();//生成公钥和私钥RSAPublicKey publicKey (RSAPublicKey) map.get("public");RSAPrivateKey privateKey (RSAPrivateKey) map.get(…

python字典统计_python字典计数

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!字典?thcollections.counter 计数器? image.png找不到键的时候会调用miss方法如果键不是字符串&#xff0c…

java相册_精致小巧的java相册制作方法

本文实例为大家分享了java相册制作方法,供大家参考,具体内容如下注:1)html上的图片是静态指定的。当更新了新的图片时必须手工更新。所以使用Servlet读取本地images中的所有图片,动态显示给用户。2)如果存在中文名的图片&#xff…

python时间差转换成天数_Python实现计算两个时间之间相差天数的方法

本文实例讲述了Python实现计算两个时间之间相差天数的方法。分享给大家供大家参考,具体如下: #-*- encoding:UTF-8 -*- from datetime import date import time nowtime date.today() def convertstringtodate(stringtime): "把字符串类型转换为da…

java break的用法_Java基础break、continue语句的用法

break适用范围:只能用于switch或者是循环语句中。当然可以用于增强for循环。break作用:1. break用于switch语句的作用是结束一个switch语句。2. break用于循环语句中的作用是结束当前所在的循环语句。break和continue区别:break是结束循环,进…

利用python画分形图_使用 Python 绘制 Mandelbrot 分形图

以前收集的关于Mandelbrot分形图的Python脚本,Mandelbrot集合的图像因它洛可可式繁复卷曲华丽的风格而受到大众的欣赏和赞叹,与其他分形图案一起,是许多艺术家和设计师的灵感来源。 是由于今天个人电脑计算能力的强大,才有可能让我…

java ucs2转utf8_Windows下Unicode(UCS2),UTF8,GBK(GB2312)互转

Windows下提供了两个编码转换函数:WideCharToMultiByte和MultiByteToWideChar。用它们可实现Unicode(UCS2),UTF8,GBK(GB2312)互转。这两个函数的原型是:intWINAPIMultiByteToWideChar(__in UINT CodePage,__in DWORD dwFlags,__in…

彻底搞懂 python 中文乱码问题_彻底搞懂 Python 编码 - sylan215的软件测试技术学习 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

因为中文的特殊编码,导致 Python2 和 Python3 使用过程中的各种编码问题,如果不清楚其中的关联关系,那么这就一直是个大坑,不是懵逼就还是懵逼,所以就目前碰到的情况彻底梳理下 Python2 和 Python3 中编码的关系和区别…

java sound api_Java Sound API

Java Sound API是javaSE平台提供底层的(low-level)处理声音接口。例外,java也提供了简单的实用的高层媒体接口(higher-level) - JMF(Java Media Framework)。Java Sound API 将需要处理的数字音频分为:simpled-audio和midi,分别提供Package来…

取pi的前8位的解压密码_两种方式实现取16位变量的高低8位, 不严谨对比

程序如下&#xff0c;第一种方式是强制指针转换&#xff0c;再取结构体成员&#xff1b;第二种方式是简单的移位。前面这种写法得考虑大小端序, 后者不用管.#include <stdio.h>#define hi8(x) ((( struct { unsigned char l; unsigned char h; } *)(&x))->h) …

java实现的小程序_Java实现 微信小程序 + 消息推送

实现效果&#xff1a;下面要显示五个字段接下来&#xff0c;参照官方文档&#xff0c;一步步实现&#xff1a;一、官方给出请求示例、返回示例二、根据上面编写实体类(1)请求参数Datapublic class SendTemplateReq {/*** 接收者(用户)的 openid*/private String touser;/*** 所…

vb excel 整行删除_Excel中常用的批量处理都不掌握,那就真的Out了

针对一些有规律&#xff0c;能批量处理的数据&#xff0c;必须采用批量处理的方法&#xff0c;否则对于工作效率就会有很大的影响。今天我们来学习的内容是Excel中的6个批量处理技巧。一、Excel批量技巧&#xff1a;批量求和。目的&#xff1a;按照“季度”和“产品”两个维度计…

eclipse找不到dynamic_Eclipse Juno在Dynamic Web Project中没有JSP(但其他...

简短的问题是,在创建动态Web项目(1.6 jdk)时,我可以看到要创建的所有文件类型,但jsp没有选项.当我检查文件关联时添加到那里,没有可供选择的JSP编辑器.稍微长一点的版本是我只想编辑JSP文件,我安装了Juno EE版本,它说安装了Web工具平台,一切正常.然而,虽然一切正常,但文件关联中…

exe编辑器_【小功能】Unreal Editor中调用exe

后续文章更新移步→微信公众号“虚幻社区”&#xff08;mantra-xhsq&#xff09;&#xff0c;您的支持是我创作的动力。在程序界混&#xff0c;哪能碰上不改需求的策划 --Mantra最近遇到了一个奇葩的需求&#xff0c;在Unreal Editor的Toolbar中添加一个快捷键&#xff0c;可以…

java bitset用途_BitSet的用法

1&#xff0c;BitSet类大小可动态改变, 取值为true或false的位集合。用于表示一组布尔标志。此类实现了一个按需增长的位向量。位 set 的每个组件都有一个 boolean 值。用非负的整数将 BitSet 的位编入索引。可以对每个编入索引的位进行测试、设置或者清除。通过逻辑与、逻辑或…

html select选择事件_按键精灵的Html系列命令实战讲解

金猪脚本(原飞猪脚本)以按键精灵教学为主,涉及UiBot&#xff0c;Python,Lua等脚本编程语言,教学包括全自动办公脚本,游戏辅助脚本,引流脚本,网页脚本,安卓脚本,IOS脚本,注册脚本,点赞脚本,阅读脚本以及网赚脚本等各个领域。想学习按键精灵的朋友可以添加金猪脚本粉丝交流群:554…