Java基础:第二十五讲 软件系统的对象与现实世界对象的关系

咱们继续学Java——高级篇 第二十五篇:之对象序列化文件格式深入剖析与序列化机制扩展 在Java编程的学习道路上,我们始终秉持着共同学习、共同成长的理念。此前我们深入研究了对象序列化文件格式的基本结构,包括文件头、对象序列、字符串和类的存储格式等,今天我们将继续深入探索对象序列化文件格式中的一些特殊情况,如类描述符的缩写、数组的存储格式、对象引用的处理,同时我们还将初步了解如何修改默认的序列化机制,这将进一步加深我们对对象序列化的理解,提升我们在处理复杂序列化场景时的能力。 阅读详情

 

    本讲介绍现实世界中的对象与软件系统中的对象的区别,以及如何从现实世界中抽象出软件系统中的对象。
1、现实世界中的对象并不一定是软件系统中的对象。
公交系统中有大量的对象 :汽车、乘客、司机、站牌、候车厅、道路、红绿灯、调度室、刷卡机、投币机、方向盘、车门、座位、车上的扶手、油箱、离合器、穿的衣服等等。列出的这些对象并不是所有的。
如果仔细看某个对象,还会有很多相关的对象。 例如您仔细想十字路口,可能会想到红绿灯、每个路口、摄像设备、红绿灯所依赖的电线杆等。想到电线杆,可能还会想上面的固定设备,如螺丝钉等。如果继续下去,可以想到系统中的更多对象。
这么多的对象在软件系统中都需要吗?肯定不是都需要。 如果要在软件系统中实现,一方面工作量太大,基本上没有办法实现。另一方面,也是最重要的一方面,是很多对象不需要。如果这个对象是必须的,那么不管多么困难也要实现。
既然有这么多的对象,有的对象需要在软件系统中实现,有的对象不需要在软件系统中实现,那么如何来选择呢?
每个系统都会有相应的目的,用于解决特定的问题。在考虑某个对象是否为软件系统中的对象的时候,只需关心该对象是否与要解决的问题相关。如何确定哪些对象与系统相关呢?
通常的做法,就是仔细分析用户提供的需求文档,这里假设所获得的需求文档是完整的。因为对象都是名词,所以可以从需求文档中来查找这些名词,在获取这些名词的过程中最好不要加入自己的想法,不能因为感觉某个对象好就添加到系统中。
通过对需求文档的分析可以得到很多名词,但是并不是所有这些名词都应该设计成对象。 例如需求中可能有这样一句话“乘客上车后,如果有座位就坐下”,这里的名词有“乘客”、“车”和“座位”。因为乘客有相关的属性和行为,并且在系统中也非常重要,所以应该作为系统的对象。同样,车也有相关的属性和行为,并且也是系统的非常重要的组成部分,所以也应该作为系统的对象。但是,座位没有自己的行为和属性,因为在模拟系统中,不会考虑座位的高度、长度、宽度、形状等,本身也没有什么行为,所以座位就不应该作为系统的对象。
【注意】这里说“座位”不是对象,只是强调在当前的系统中不是对象。如果在另外一个软件系统中,它可能就是对象了。比如汽车生产商,肯定会考虑座位的形状、颜色、材料等。
2、从现实世界的对象抽象出软件系统中的对象
想一下软件系统能够干什么?多数情况下,是对现实世界的模拟,是对现实世界中的某些工作模拟,由电脑来完成一些原来需要人工完成的任务。例如使用的ATM 自动提款机,原来要取钱,需要到银行去,由银行的工作人员来办理业务。现在如果取款不超过5000 元,就可以在自动提款机上提取,并且现在很多银行都要求客户在ATM 上取款,这种要求也许不合理,但是不可否认的是,ATM 代替银行的工作人员办理了业务。
如果要构造一个系统模拟10 路公交系统的运行情况,这时候需要在系统中构造汽车对象模拟现实世界中的汽车。就像前面在介绍对象的属性的时候,知道汽车有很多属性,汽车的长宽高,重量,颜色,车牌号,投币机,车门,广播,车轮,发动机等等。在软件系统中是否需要把这些属性全部模拟?
汽车有这么多属性,首先必须肯定的是无法把这些属性描述出来,这也是能力所不允许的。
既然要模拟汽车,又不能把所有的属性全部模拟出来,那么应该描述哪些属性呢?这就是一个抽象的过程,从现实世界中的具体对象抽象出软件系统中的抽象对象。
抽象的过程实际上就是选择属性和行为的过程,要哪些属性,不要哪些属性,取决于这些属性是否对要构建的系统有用。下面通过分析汽车的几个属性来介绍如何选择属性。
n         车牌号。汽车有车牌号,车牌号对软件系统有用,可以把所有汽车区分开,系统需要根据车牌号来调度汽车。所以需要车牌号。
n         车的位置信息。要模拟10 路公交系统的运行情况,需要知道在某个时刻,某辆汽车的位置,所以也是需要的。
n         车的运行方向。知道车的方向,才可以根据运行方向和车的当前位置决定下一个时刻汽车的位置,所以也是需要的。
n         汽车的长度。汽车的长度是6 米 还是5 米 ,对模拟系统来说没有太大的影响,所以在这个系统中不需要考虑汽车的长度。
这个抽象的过程可以根据模拟系统的功能来进行,功能涉及哪些属性,就对哪些属性进行分析。
这个过程实际上就是对系统所需要的所有对象进行分析,提取有用的属性和行为。
【注意】同样一个对象在不同的软件系统中的抽象结构是不一样的。同样是汽车,如果不是在10 路公交系统中,相关属性的选择就不同了。如果是公交公司的资产管理系统,这时候对汽车对象的抽象结果就不一样了,可能需要考虑汽车的出厂日期、汽车价格、上次维修时间、出车次数、责任人等。
 
     李绪成 优快云 Blog: http://blog.youkuaiyun.com/javaeeteacher
    如果想和我交流,或者和我成为朋友,请点击:http://student.youkuaiyun.com/invite.php?u=124362&c=7be8ba2b6f3b6cc5
《大象 Thinking In UML》azw3版 (带书签) 《大象 Thinking In UML》azw3版(带书签),欢迎下载 谭云杰 著 立即下载

相关推荐

INS/伪距组合导航(1)

星间单差GNSS/INS伪距紧组合

u014430081的博客 874

Java技术提供了从现实世界到应用软件世界的对象建模能

发现一家美国公司在招聘Java程序员,为了证明自己的Java编程水平,我参加了Sun公司的SCJP(Sun Certified Java Programmer)考试,通过!然后加入了这家公司的Java开发团队。   为了再次证实我在Java软件开发方面的能力和经验,我参加了Sun公司的SCJD(Sun Certified Java Developer)的考试,并顺利通过。同时我认识到,Java技

u012402926的专栏 746

从入门到精通:用友BIP旗舰版全模块实施与运维实战指南

本文详细介绍了用友BIP旗舰版的全模块实施与运维实战指南,涵盖财务云、供应链云、生产制造等核心模块的配置与优化技巧。通过渐进式学习法和实战案例,帮助用户从入门到精通,提升系统实施效率和运维能力,特别适合企业IT人员和实施顾问参考。

weixin_29207533的博客 899

周考二错题总结

错题

LUOZONGW的博客 317

高精地图语义分割标注

什么是语义分割?语义分割与目标检测的区别?语义分割的关键应用场景有哪些?高精地图语义分割标注的难点?

weixin_52509513的博客 1645

2024年03月CCF-GESP编程能力等级认证Python编程五级真题解析

下面流程图在yr输入2024时,可以判定yr代表闰年,并输出 2月是29天 ,则图中菱形框中应该填入( )。 A. (yr % 400 == 0) or (yr % 4 == 0) B. ( yr % 400 == 0) or (yr % 4 == 0 and yr %100 != 0) C. ( yr % 400 == 0) and ( yr % 4 == 0) D. (yr % 400 == 0) and (yr % 4 == 0 and yr % 100 != 0)

人生就是一个不断学习的过程 745

java面试题选择题题库

编译运行以下程序后,关于输出结果的说明正确的是 ( ): public class Conditional{ public static void main(String args[ ]){ int x=4; System.out.println(“value is “+ ((x>4) ? 99.9 :9)); } } 【选项】 A. 输出结果为:value is 99.99 B. 输出结果为:value is 9 C. 输出结果为:value is 9.0 D. 编译错误 【正确答案 ...

xiaowei1999的博客 7966

第十五章数据管理成熟度评估【6’】(DAMA-CDGA 2022年以后历年模拟题真题汇总,基本包含所有考点。)

第十五章数据管理成熟度评估【6’】(DAMA-CDGA 2022年以后历年模拟题真题汇总,基本包含所有考点。)

JasonH2021的博客 403

最全的Java笔试题库之选择题篇-总共234道【1~60】

1.下面中哪两个可以在A的子类中使用:( ) class A { protected int method1 (int a, int b) { return 0; } } A. public int method 1 (int a, int b) { return 0; } B. private int method1 (int a, int b) { r

qq_36075612的博客 2万+

基于STM32L4XX、HAL库的Ra-01SC-P LoRa模块驱动程序设计

0x22) { // SX1276/SX1278版本号。// 发射功率(2-20)// 工作频率(Hz)// 编码率(5-8)

zhusl6688的博客 423

【BlueZ】编译产物详解:可执行文件/库文件/工具的生成路径与用途

BlueZ二次开发编译产物机制解析 摘要:在BlueZ蓝牙协议栈二次开发中,90%的报错源于对编译产物类型和路径的混淆。本文系统剖析BlueZ的三阶段编译机制:1)配置阶段生成Makefile;2)编译阶段在.libs目录下产生临时库和可执行文件(不可直接运行);3)安装阶段将产物部署到系统标准路径。重点解析守护进程、命令行工具、动态库的核心路径差异,并针对五大高频问题(如临时库运行崩溃、动态库不匹配、系统覆盖等)给出解决方案。

byte轻骑兵的技术小窝 1万+

Java基础:第二十六讲 从对象抽象出类

李绪成的一亩三分地 3742

产品缺陷检测:表面缺陷检测_(1).产品缺陷检测基础理论

确定像素之间的相似性准则,如灰度值的差异。

zhubeibei168的博客 832

第二十五讲 - Java集合之Map、HashMap、TreeMap

深入探索Java世界,领略编程之美。从基础语法到高级特性,从实战案例到性能优化,《Java后端学习路线》专栏带你领略编程的无穷魅力。无论你是初学者还是资深开发者,这里都有适合你的精彩内容。让我们一起在Java的世界里,书写代码的传奇! 欢迎大家支持订阅本专栏,后续内容更加精彩。

智潮先锋聚集地 1115

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

0基础java入门:第二十五节.面向对象思想理解思路。

0基础java入门:第二十五节.面向对象思想理解思路。(本章需要时间和代码积累才能理解通透 不要着急 先来了解 敲上三年代码再回来看) 面向对象是现在大部分编程语言中都会提及和使用到的一种思想方式。有人说很难理解,但个人觉得其实不难。因为面向对象本身是更贴近现实生活的思考方式。比如,当我们想要一辆汽车,首先想到的是找到一个卖车的商店。这里的商店就是一个对象,这个商店对象的功能就是售卖汽车。通过商店可以获得汽车。这种思考方式的核心是什么我们在之后的内容中逐步分析。 面向对象与面向过程 首先我们先来了解以

MrTeacherZ的博客 257

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

第二十五节:Java语言基础-面向对象基础

面向对象 面向过程的代表主要是C语言,面向对象是相对面向过程而言,Java是面向对象的编程语言,面向过程是通过函数体现,面向过程主要是功能行为。 而对于面向对象而言,将功能封装到对象,所以面向对象是基于面向过程的。以前是主要以面向过程为思想,现在是将功能装进对象中,如果要用到功能时,就调用该对象即可。 面向对象是入门思想的进步,适用于人类的思考,将复杂的东西进行了简单化,将我们程...

程序员哆啦A梦,蓝胖子 503

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

面向对象进阶(下)(JAVA笔记第二十五期)

public abstract 返回值类型 方法名(参数列表);public abstract class 类名{}接口用interface来定义格式public interface 接口名{}接口与类之间是实现关系,通过implements关键字表示格式public class 类名 implements 接口名{}注意:一个类可以实现单个接口(单实现),也可以实现多个接口(多实现)举例public class 类名 implements 接口名1,接口名2{}

2403_87139271的博客 2215

Java学习第二十五部分——Hibernate

Hibernate是一个Java开源ORM框架,通过对象关系映射简化数据库操作。本文介绍了它的基本信息,工作流程,应用场景,项目实战等内容

2503_92550335的博客 1408

咱们一起学 Java(第二十五篇)

大家好,在之前的学习中,我们已经了解了如何创建用户自定义类,包括类的基本结构、实例域、构造器和实例方法的相关知识,并且通过`Employee`类的示例有了初步的实践。今天,我们将深入剖析`Employee`类,进一步探讨构造器的细节、方法中的隐式参数与显式参数等重要概念,这将帮助我们更加深入地理解Java面向对象编程中类的内部机制,提升我们编写高质量类的能力。

wj_rdk的博客 2199

面试 Java 基础八股文十问十答第二十五期

在 Java 中,静态方法和非静态方法有着不同的调用方式和作用域。静态方法属于类级别,可以直接通过类名调用,而非静态方法则属于对象级别,需要通过对象实例调用。在静态方法内部,无法直接访问非静态成员(例如非静态字段或者非静态方法),因为在静态方法调用时,并没有对象实例与之关联,而非静态成员属于对象的状态和行为,需要通过对象实例才能访问。如果在静态方法内部尝试调用非静态成员,编译器会报错,因为在静态方法内部无法确定要访问的对象实例。

qq_67358181的博客 799

第二十五节 Java 继承

Java 继承

2301_78772942的博客 1035

java学习第二十五天

类与对象,属性,内存空间,对象

wjkqq0921的博客 231

java package 修饰符_JAVA 基础 / 第二十五课: 类和对象 / JAVA中的包 PACKAGE和四种访问修饰符...

2018-03-14一、包:package把比较接近的类,规划在同一个包下。Hero,ADHero 规划在一个包,叫做charactor(角色)Item,Weapon规划在另一个包下,叫做 property(道具)在最开始的地方声明该类所处于的包名package charactor; //在最开始的地方声明该类所处于的包名public classHero {String name;//姓名fl...

weixin_42511714的博客 274

java第二十五课 —— 多态

方法或对象具有多种形态。是面向对象的第三大特征,多态是建立在封装和继承基础之上的。

Liuxu 的博客 1211
上一篇: Java基础:第二十四讲 类与对象的关系
下一篇: Java基础:第二十六讲 从对象抽象出类
老李-大连
博客等级 码龄20年 3206粉丝 308原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值