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字典计数

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

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

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

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

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

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来…

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

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

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

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

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

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

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

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

java 验证码_java学习之web基础(6):使用Response的输出流在页面输出验证码

package 输出并且我们可以写一个简单的网页&#xff0c;来实现点击更新验证码<!DOCTYPE html>

java socket编程实现聊天程序_java Socket编程 聊天程序 服务器端和客户端

[java]代码库package com.gufengxiachen.sthreadchatapp;/*** author GUXIA*/import java.io.BufferedReader;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;imp…

电商前台模板中文html5_跨境电商平台上产品如何上传?虾皮新版批量上传工具使用指南分享...

大家好&#xff0c;这里是天师跨境&#xff0c;今天来为电商新人们解答一下关于如何在跨境电商平台上上传产品的疑惑&#xff0c;顺便介绍一下虾皮跨境平台的新版批量上传工具是如何使用的。在跨境电商平台上开店的新手们在入驻成功后&#xff0c;一般最先面临的问题就是上传产…

移动端 关闭浏览器事件_前端开发中什么是移动端点透事件?

点透事件&#xff1a;是指两个元素其中一个元素具有默认的点击事件&#xff0c;当我们让不具有点击事件的元素隐藏起来&#xff0c;会触发另一个元素的点击事件&#xff0c;这种行为被称之为点透事件。如下图所示&#xff1a;当我们给div元素添加touchstart事件让div元素隐藏起…

清除浏览器缓存之后为什么还是显示旧的html页面_Web缓存控制策略详解

管理Web缓存的最常用和最有效的方法之一是通过Cache-Control HTTP标头&#xff0c;由于此标头适用于Web页面的缓存&#xff0c;这意味着我们页面上的所有内容都可以具有非常精细化的缓存策略。通过各种自定义策略&#xff0c;我们控制的策略就可以变得非常复杂和强大。Cache-Co…

java jtextfield 事件_JAVA JTextField事件处理

初学JAVA&#xff0c;笔记&#xff1a;package windows;import javax.swing.*;import java.awt.*;import java.awt.event.*;class WindowFlow extends JFrame implements ActionListener{private static final long serialVersionUID 1L;JTextField text1,text2;WindowFlow(St…

js封装函数_JavaScript基础-如何封装函数来改变元素的位置

点击右上方红色按钮关注“小郑搞码事”&#xff0c;每天都能学到知识&#xff0c;搞懂一个问题&#xff01;大家好&#xff01;我是/小郑搞码事/的小郑今天给大家分享JavaScript的基础知识-改变元素的位置。没错&#xff0c;用JS实现过动画的同学都应该了解一点&#xff0c;简单…

java程序设计与实践教程 王薇 doc_Java程序设计与实践教程 王薇主编 答案

Java程序设计与实践教程 王薇 主编 董迎红 副主编 课后习题 答案第1章 JAVA简介一、判断题1.√ 2.√ 3. 4. 5. 6.√ 7.√ 8.√ 9. 10.二、填空题1.Application Applet 2. 类(字节码文件、目标文件) .class3.对象 4. 主 5. J2SE J2EE J2ME三、选择题1.B 2. D 3.B 4.B 5. A四、简…

maya藤蔓插件_Maya特效制作之植物生长动画制作教程(二)之多条藤蔓动画制作...

四、制作多条蔓藤植物下面我们要让很多植物在这个“崖壁”上生长出来&#xff0c;也就是要重复很多次前面的工作&#xff0c;当然可以这样一步一步地做&#xff0c;在“崖壁”面片上手动画很多的线&#xff0c;但下面尝试一种新的方法来制作&#xff0c;让粒子在“崖壁”面片Pl…