01-Java编程基本概念

计算机基础

  计算机包括 硬件软件 两部分,硬件包括计算机中可以看得见的物理部分,而软件提供看不见的指令,这些指令控制硬件并且使得硬件完成特定的任务。程序设计 就是创建(或开发)软件,其中软件包含了指令,用来告诉计算机做什么。软件开发人员则是在被称为 程序设计语言 的强大工具的帮助下创建软件。

计算机硬件

01

(一)中央处理器

  中央处理器(Central Processing Unit,CPU) 是计算机的大脑,它从内存中获取指令,然后执行这些指令。它主要包括:控制单元(control unit)算术/逻辑单元(arithmetic/login unit)

  • 控制单元:用于控制和协调其它组件的动作
  • 算术/逻辑单元:用于完成数值运算和逻辑运算

  每台计算机都有一个 内部时钟,该时钟以固定速度发射电子脉冲,时钟速度越快,在给定的时间段内执行的指令就越多,速度的计量单位是 赫兹(Hz),1Hz 相当于每秒 1 个脉冲。

  核(core) 是处理器中实现指令读取和执行的部分,最初一个 CPU 只有一个核,一个多核 CPU 是一个具有两个或者更多独立核的组件,可提高 CPU 的处理能力。

(二)内存

  计算机就是一系列的 电路开关,每个开关存在两种状态:关(off)和开(on)。如果电路是开的,它的值是 1;如果电路是关的,它的值是 0。 一个 0 或者一个 1 存储为一个 比特(bit)比特是计算机中最小的存储单位。计算机中 最基本的存储单元是字节(byte) ,每个字节由 8 个比特构成。计算机的存储能力是以字节和多字节来衡量的:

  • 千字节(kilobyte,KB) = 1024 B
  • 兆字节(megabyte,MB) = 1024 KB
  • 千兆字节(gigabyte,GB) = 1024 MB
  • 万亿字节(terabyte,TB) = 1024 GB

  内存(Random-Access Memory,RAM)由一个有序的字节序列组成,用于存储程序及程序需要的数据(一个程序和它的数据在被 CPU 执行前必须移到计算机的内存中)。每个字节都有一个唯一的地址,使用这个地址确定字节的位置,以便于存储和获取数据。一个计算机具有的RAM越多,它的运行速度越快(但是此规律是有限制的)。内存与CPU一样,也是构建在表面嵌有数百万晶体管的硅半导体芯片上,但内存芯片更简单、更低速、更便宜。

  内存主要有两个作用:

  • 保存从硬盘读取的数据,提供给 CPU 使用
  • 保存 CPU 的一些临时执行结果,以便 CPU 下次使用或保存到硬盘

  内存存取数据的速度比硬盘的存取速度快很多,而 CPU 的速度比内存不知道还要快多少倍。当我们把程序从硬盘放到内存以后,CPU 就直接在内存运行程序,这样比 CPU 直接在硬盘运行程序就要快很多。内存解决了一部分 CPU 运行过快,而硬盘数据存取太慢的问题, 提高了我们的电脑的运行速度。但内存是带电存储的(一旦断电数据就会消失),而且容量有限,所以要长时间储存程序或数据就需要使用硬盘。

(三)存储设备

  内存中的信息在断电时会丢失,那我们可以考虑将程序和数据永久的保存在存储设备上,当计算机确实需要这些数据时再移入内存,因为从内存中读取比从存储设备读取要快得多。

  存储设备主要有以下三种:

  • 磁盘驱动器:每台计算机至少有一个硬盘驱动器,用于永久的保存数据和程序
  • 光盘驱动器(CD和DVD)
  • USB闪存驱动器

(四)输入输出设备

  常见的输入设备有键盘(keyboard)和鼠标(mouse) ,常见的输出设备有显示器(monitor)和打印机(printer)。

关于显示器屏幕分辨率

显示器屏幕分辨率是指显示设备水平和垂直方向上显示的像素(px)数,分辨率可以手工设置,分辨率越高图像越锐化、越清晰。

像素密度 = √[(长度像素数)^2+(宽度像素数)^2] / 屏幕尺寸

(五)通信设备

  计算机可以通过通信设备进行联网,常见的设备有:

  • 拨号调制解调器:使用的是电话线,传输速度可达56000bps(bps:每秒比特)
  • DSL(数字用户线):使用的也是电话线,但传输速度较上面的快 20 倍
  • 电缆调制解调器:利用有线电视电缆进行数据传输,通常速度比 DSL 快
  • 网络接口卡(NIC):将计算机接入局域网(LAN)的设备,通常用于大学、商业组织和政府组织,速度甚至可达1000Mbps
  • 无线网络:在家庭、商业和学校中极其常见,计算机可通过无线适配器连接到局域网或internet上

操作系统

  操作系统(Operating System)是运行在计算机上的最重要的程序,它可以管理和控制计算机的活动。操作系统的主要任务:控制和监视系统的活动;分配和调配系统资源;调度操作

万维网

  万维网(World Wide Web,www,环球信息网)常简称为 Web,其发明者是蒂姆·伯纳斯·李,可以分为 Web客户端Web服务器 程序。 www 可以让 Web 客户端(常为浏览器)访问浏览 Web 服务器上的页面, 是一个由许多互相链接的超文本组成的系统,通过互联网访问。在这个系统中,每个有用的事物称为一样 资源,并且由一个全局 统一资源标识符(URI)标识,这些资源通过 超文本传输协议(Hypertext Transfer Protocol)传送给用户,而后者通过点击链接来获得资源。

02

  万维网是无数个网络站点和网页的集合,它们在一起构成了因特网(Internet)最主要的部分(因特网也包括电子邮件、Usenet以及新闻组),它实际上是多媒体的集合,是由超级链接连接而成的,通常我们通过网络浏览器上网观看的就是万维网的内容。

Java 程序运行机制

  Java语言是一种特殊的高级语言,既具有解释型语言的特征,也具有编译型语言的特征,因为Java程序要经过 先编译、后解释 两个步骤。

高级语言的运行机制

  计算机高级语言按照程序的执行方式可以分为 编译型和解释型 两种:

  • 编译型:使用专门的编译器,针对特定平台将某种高级语言源代码一次性"翻译"成可被平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式,这个转换过程成为编译。编译生成的可执行程序可以脱离开发环境,在特定的平台上独立运行

  • 解释型:使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言

Java 程序的运行机制和 JVM

  Java编写的程序需要经过编译步骤,但这个步骤并不会生成特定平台的机器码,而是生成一种与平台无关的字节码(.class文件)。这种字节码是不可执行的,需要使用Java解释器来解释执行。

03

  Java 语言里面负责解释执行字节码文件的是 Java虚拟机(JVM),所有平台上的 JVM 向编译器提供相同的编程接口,而编译器只需要面向虚拟机,生成虚拟机能够理解的代码,然后由虚拟机来解释执行(在一些虚拟机的实现中,还会将虚拟机代码转换成特定系统的机器码执行,从而提高执行效率)。

  JVM 是一个抽象的计算机,和实际的计算机一样,它具有指令集并使用不同的存储区域。它负责执行指令,还要管理数据、内存和寄存器。Oracle 公司制定的Java虚拟机规范在技术上规定了 JVM 的统一标准,具体定义了 JVM 的如下细节:指令集、寄存器、类文件的格式、栈、垃圾回收堆、存储区。

垃圾回收机制

  Java 不需要程序员直接控制内存回收,Java 程序的内存分配和回收都是由 JRE 在后台自动进行的。JRE 会负责回收那些不再使用的内存,这种机制被称为 垃圾回收(GC) 。通常JRE会提供一个后台线程来进行检测和控制,一般都是在 CPU 空闲或者内存不足时自动进行垃圾回收,而程序员无法精确控制垃圾回收的时间和顺序等。

  Java 的堆内存是一个运行时数据区,用于保存类的实例,Java 虚拟机的堆内存中存储着正在运行的应用程序所建立的所有对象,这些对象不需要程序通过代码来显式地释放。一般来说,堆内存的回收由垃圾回收来负责,所有的 JVM 实现都有一个垃圾回收器管理的堆内存。垃圾回收是一种动态存储管理技术,它自动释放不再被程序引用的对象,按照特定的垃圾回收算法来实现内存资源的自动回收功能。

  在 Java中,当没有引用变量指向原先分配给某个对象的内存时,该内存便称为垃圾。JVM 的一个超级线程会自动释放该内存区。垃圾回收意味着程序不再需要的对象是"垃圾信息",这些信息将被丢弃。

  当一个对象不再被引用时,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象外,垃圾回收也可以清除内存记忆碎片。由于创建对象和垃圾回收器释放丢弃对象所占的内存空间,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存区,碎片管理将所占用的堆内存移到堆的一端,JVM 将整理出的内存分配给新的对象。

  垃圾回收能自动释放内存空间,减轻编程的负担。这使 Java 虚拟机具有两个显著的优点:

  • 垃圾回收机制可以很好地提高编程效率
  • 垃圾回收机制保护程序的完整性,垃圾回收是 Java 语言安全性策略的一个重要特征

  垃圾回收的一个潜在缺点是它的开销影响程序性能。Java 虚拟机必须跟踪程序中有用的对象,才可以确定哪些对象是无用的对象,并最终释放这些无用的对象。这个过程需要花费处理器的时间。其次是垃圾回收算法的不完备性,早先采用的某些垃圾回收算法就不能保证100%收集到所有的废弃内存。

  任何一种垃圾回收算法一般要做两件基本的事情:发现无用的对象;回收被无用对象占用的内存空间,使该空间可被程序再次使用。通常,垃圾回收具有如下几个特点:

  • 垃圾回收机制的工作目标是回收无用对象的内存空间,这些内存空间都是 JVM 堆内存里的内存空间。垃圾回收只能回收内存资源,对其他物理资源,如:数据库连接、磁盘I/O等资源则无能为力
  • 为了更快地让垃圾回收机制回收那些不再使用的对象,可以将该对象的引用变量设置为 null,通过这种方式暗示垃圾回收机制可以回收该对象
  • 垃圾回收发生的不可预知性。由于不同 JVM 采用了不同的垃圾回收机制和不同的垃圾回收算法,因此它有可能是定时发生的,有可能是当 CPU 空闲时发生的,也有可能和原始的垃圾回收一样,等到内存消耗出现极限时发生,这和垃圾回收实现的选择及具体的设置有关系(虽然程序员可以通过调用 Runtime 对象的 gc() 或 System.gc() 等方法来建议系统进行垃圾回收,但这种调用仅仅是建议,依然不能精确控制垃圾回收机制的执行)
  • 垃圾回收的精确性主要包括两个方面:一是垃圾回收机制能够精确地标记活着的对象;二是垃圾回收能够精确地定位对象之间的引用关系
  • 现在的 JVM 有多重不同的垃圾回收实现,每种回收机制因其算法差异可能表现各异

  当编写Java程序的时候,一个基本原则是:对于不再使用的对象,不要引用它们

第一个 Java 程序

HelloWorld 程序

  首先创建一个 HelloWorld.java 文件:

public class HelloWorld
{
    public static void main (String[] args) {
        System.out.println("Hello World!!");
    }
}

  然后使用 java -d destdir srcFile 命令来编译Java程序,其中 -d destdir 用来指定编译生成的字节码文件的存放路径,srcFile 是Java的源文件所在的位置(可以是绝对位置,也可以是相对位置):

04

  然后可以使用 java 类名 的命令来运行Java程序:

05

Java 源文件的命名规则

  Java 文件的命名必须满足如下规则:

  • Java 程序源文件的后缀必须是 .java
  • 通常情况下,Java 源文件的主文件名可以是任意的,但如果 Java 程序源代码里定义了一个 public 类,则该源文件的主文件名必须与该 public 类的类名相同(也就是说一个 Java 源文件里最多只能定义一个 public 类

  虽然源文件里面没有包含 public 类定义的时候,这个源文件的文件名是可以随意的,但推荐让 Java 源文件的主文件名与类名相同:

  • 一个 Java 源文件只定义一个类,不同的类使用不同的源文件定义
  • 让 Java 源文件的主文件名与该源文件中定义的 public 类同名

Java 注释

  注释的主要作用:

  • 对所写的程序进行解释说明,增强可读性
  • 调试所写的代码

  Java 中的注释可以分为:

  • 单行注释:// 注释的内容
  • 多行注释:/* 注释的内容*/
public class HelloWorld
{
    /*
        这里面的内容全部是多行注释
        下面定义了一个main方法
    */
    public static void main(String[] args) {
       // 这是一行简单的注释
       System.out.println("Hello world");
    //    System.out.println("这里的代码被注释了,不会执行");
    }
}

  关于注释的特点:

  • 单行注释和多行注释注释了的内容不参与编译,也就是说编译以后生成的 .class 结尾的字节码文件中不包含注释掉的信息
  • 多行注释不可以嵌套使用

  Java 语言还提供了一种功能更强大的注释形式:文档注释,如果编写 Java 源代码时添加了合适的文档注释,然后通过 JDK 提供的 javadoc 工具可以直接将源代码里的文档注释提取成一份系统的 API 文档。

  API 文档是提供关于类库如何使用的一个说明书,Java 提供了大量的基础类,因此 Oracle 也为这些基础类提供了相关的 API 文档:

06

  API文档页面被分为三个部分,左上角部分是 API 文档的"包列表区",在该区域内可以查看 Java 类的所有包;左下角是 API 文档的"类列表区",用于查看 Java 的所有类;右边页面是"详细说明区",默认显示的是各包空间的说明信息。

  如果单击"类列表区"里列出的某个类,将看到下面的界面:

07

  如果开发者需要获得更详细的信息,则可以单击具体的内部类、成员变量、构造器和方法的链接,从而看到对应项的详细用法说明。对于内部类、成员变量、方法列表区都可以分为左右两格,其中左边一格是该项的修饰符、类型说明,右边一格是该项的简单说明:

08

  在开发中定义类、方法时也可以先添加文档注释,然后使用 javadoc 工具来生成自己的 API 文档。该工具只处理文档源文件在类、接口、方法、成员变量、构造器和内部类之前的注释,忽略其它地方的文档注释。并且 javadoc 工具默认只处理以 public 或 protected 修饰的类、接口、方法、成员变量、构造器和内部类之前的文档注释(如果希望提取 private 修饰的内容,可以在使用 javadoc 工具时增加 -private 选项)。

  文档注释以 斜线后紧跟两个星号(/**)开始,以星号后紧跟一个斜线( */)结束,中间部分全部是文档注释,会被提取到 API 文档中。

  首先创建两个文件:

package lee;

/**
 * Description
 * <br>网站:<a href="http://www.baidu.com">百度</a>
 * <br>Copyright (c), 2002-2020 , YXBB
 * <br>This program is protected by copyright laws
 * <br>Program Names:
 * <br>Date:
 * @author YXBB
 * @version 1.0
 */
public class JavadocTest {
    /**
     * 简单测试成员变量
     */
    protected String name;
    /**
     * 主方法,程序的入口
     */
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
package lee;

/**
 * Description
 * <br>网站:<a href="http://www.baidu.com">百度</a>
 * <br>Copyright (c), 2002-2020 , YXBB
 * <br>This program is protected by copyright laws
 * <br>Program Names:
 * <br>Date:
 * @author YXBB
 * @version 1.0
 */
public class Test {
    /**
     * 简单测试成员变量
     */
    public int age;
    /**
     * Test类的测试构造器
     */
    public Test() {
        
    }
}

  编好上面的 Java 程序后,可以使用 javadoc 工具提取这两个程序中的文档注释来生成 API 文档了。javadoc 命令的基本用法如下:javadoc 选项 Java源文件|包。javadoc 命令可对源文件、包生成 API 文档,在上面的语法格式中,Java 源文件可以支持通配符,例如使用 *.java 来代表当前路径下所有的 Java 源文件。javadoc 常用的选项如下:

  • -d <directory>:该选项指定一个路径,用于将生成的 API 文档放到指定目录下
  • -windowtitle <text>:该选项指定一个字符串,用于设置 API 文档的浏览器窗口标题
  • -doctitle <html-code>:该选项指定一个 HTML 格式的文本,用于指定概述页面的标题
  • -header <html-code>:该选项指定一个 HTML 格式的文本,包含每个页面的页眉

只有对处于多个包下的源文件来生成 API 文档时,才有概述页面。javadoc 命令还包含了大量其它选项,可以通过在命令行窗口执行 javadoc -help 来查看 javadoc 命令的所有选项。

  针对上面的类生成 API 文档需要在控制台执行下面的命令:

javadoc -d apidoc -encoding utf-8 -charset utf-8 -windowtitle 测试 -doctitle 学习 javadoc -header 我的类 *Test.java

  此时就可以看到在本地生成一个 apidoc 的目录:

09

  打开其中的 index.html 页面可以看到效果:

10

  如果希望 javadoc 工具生成更详细地文档信息(例如方法参数、返回值等),则可以利用 javadoc 标记,常用的标记如下:

  • @author:指定Java程序的作者
  • @version:指定源文件的版本
  • @deprecated:不推荐使用的方法
  • @param:方法的参数说明信息
  • @return:方法的返回值说明信息
  • @see:“参见”,用于指定交叉参考的内容
  • @exception:抛出异常的类型
  • @throws:抛出的异常,和@exception同义

  这些标记的使用是有位置限制的:

  • 可以出现在类或者接口文档注释中的有@see、@deprecated、@author、@version等
  • 可以出现在方法或构造器文档注释中的有@see、@deprecated、@param、@return、@throws和@exception等
  • 可以出现在成员变量的文档注释中的有@see和@deprecated等。

  为了能够提取到文档中的 @author 和 @version 等标记信息,在使用 javadoc 工具时候需要增加 -author-version 两个选项:

javadoc -d apidoc -encoding utf-8 -charset utf-8 -windowtitle 测试 -doctitle 学习 javadoc 工具的测试 -header 我的类 -version -author *Test.java

  API 文档中的包注释并不是直接放在 Java 源文件中的,而是必须另外指定,通常通过一个标准的 HTML 文件来提取包注释,这个文件被称为 包描述文件。包描述文件的文件名通常是 package.html,并与该包下所有的 Java 源文件放在一起,javadoc 工具会自动寻找对应的包描述文件,并提取该包描述文件中的 <body/> 元素里的内容,作为该包的描述信息。

javadoc -d apidoc -encoding utf-8 -charset utf-8 -windowtitle 测试 -doctitle 学习 javadoc -header 我的类 -version -author lee

使用 VSCode 搭建 Java 开发环境

  打开 VSCode,下载 Extension Pack for Java 插件:

11

  新建目录,并在目录中创建 .java 文件:

12

  然后在菜单栏中选择运行程序:

13

  然后就可以看到运行结果:

14

UML(统一建模语言)介绍

  面向对象软件开发需要经过 OOA(面向对象分析)OOD(面向对象设计)OOP(面向对象编程)三个阶段。OOA 对目标系统进行分析,建立分析模型,并将之文档化。OOD 用面向对象的思想对 OOA 的结果进行细化,得出设计模型。OOA 和 OOD 的分析、设计结果需要统一的符号来描述、交流并记录,UML 就是这种用于描述、记录 OOA 和 OOD 结果的符号表示法。

  UML 图大致上可分为 静态图动态图 两种:

15

用例图

  用例图用于描述系统提供的系统功能,每个用例则代表系统的一个功能模块。用例图的主要目的是帮助开发团队以一种可视化的方式理解系统的需求功能,用例图对系统的实现不做任何说明,仅仅是系统功能的描述。

  用例图包括 用例、角色、角色和用例之间的关系以及系统内用例之间的关系 ,用例图一般表示出用例的组织关系(要么是整个系统的全部用例,要么是完成具体功能的一组用例):

16

  用例图通常用于表达系统或者系统范畴的高级功能,如上图可以很容易看出该系统所提供的功能(系统允许注册用户登录、发帖和回复,其中发帖和回复需要依赖于登录;允许管理员删除其他人的帖子,删帖也需要依赖于登录)。

  用例图主要在需求分析阶段使用,主要用于描述系统实现的功能,方便与客户交流,保证系统需求的无二性,用例图表示系统外观,不要指望用例图和系统的各个类之间有任何联系。不要把用例做得过多,过多的用例将导致难以阅读,难以理解;尽可能多地使用文字说明。

类图

  类图表示系统中应该包含哪些实体,各实体之间如何关联;换句话说,它显示了系统的静态结构,类图可用于表示逻辑类,逻辑类通常就是业务人员所谈及的事物种类。类在类图上使用包含三个部分的矩形来描述,最上面的部分显示类的名称,中间部分包含类的属性,最下面的部分包含类的方法

17

  类图除了可以表示实体的静态内部结构之外,还可以表示实体之间的相互关系:关联(包括聚合、组合)、泛化(与继承同一个概念)和依赖

(一)关联

  关联具有一定的方向性,如果仅能从一个类单方向地访问另一个类,则被称为 单向关联;如果两个类可以相互访问对象,则被称为 双向关联。一个对象能访问关联对象的数目被称为 多重性。关联 使用一条实线 来表示,带箭头的实线 表示单向关联。

  关联关系包括两种特例:聚合组合,它们都有部分和整体的关系,但通常认为组合比聚合更加严格。当某个实体聚合成另一个实体时,该实体还可以同时是另一个实体的部分,例如学生既可以是篮球俱乐部的成员,也可以是足球俱乐部的成员;当某个实体组合成另一个实体时,该实体则不能同时是一个实体的部分。聚合使用 带空心菱形框的实线 表示,组合则使用 带实心菱形框的实线 表示:

18

(二)泛化

  泛化与继承是同一个概念,都是指子类是一种特殊的父类,类与类之间的继承关系是非常普遍的,继承关系使用 带空心三角形的实线 表示:

19

  还有一种与继承类似的关系,类实现接口可视为一种特殊的继承,这种实现用 带空心三角形的虚线 表示。

(三)依赖

  如果一个类的改动会导致另一个类的改动,则称两个类之间存在依赖。依赖关系使用 带箭头的虚线表示,其中箭头指向被依赖的实体。依赖的常见原因如下:

  • 改动的类将消息发给另一个类
  • 改动的类以另一个类作为数据部分
  • 改动的类以另一个类作为操作参数

20

  通常依赖是单向的,尤其是当数据表现和数据模型分开设计时,数据表现依赖于数据模型。

组件图

  对于大型应用程序而言,通常不只是单独一个类或单独一组类所能完成的,通常会由一个或多个可部署的组件组成(对Java程序而言,可复用的组件通常打包成一个 JAR、WAR 等文件)。组件图提供系统的物理视图,它的用途是 显示系统中的软件对其他软件组件的依赖关系 。组件图可以在一个非常高的层次上显示,仅显示系统中粗粒度的组件,也可以在组件包层次上显示。

21

  组件图通常包含 **组件、接口和 Port **等图元,UML 使用带符号的矩形来表示组件,使用圆圈代表接口,使用位于组件边界上的小矩形代表 Port。组件的接口表示它能对外提供的服务规范,这个接口通常有两种表示形式:

  • 用一条实线连接到组件边界的圆圈表示
  • 使用位于组件内部的圆圈表示

  组件除了可以对外提供服务接口之外,组件还可能依赖于某个接口,组件依赖于某个接口使用一条带半圆的实线来表示:

23

部署图

  部署图用于 描述软件系统如何部署到硬件环境中,它的用途是显示软件系统不同的组件将在何处物理运行,以及它们将如何彼此通信。因为部署图是对物理运行情况进行建模,所以系统的生产人员就可以很好地利用这种图来安装、部署软件系统。

  部署图中的符号包括组件图中所使用的符号元素,另外还增加了 节点 的概念:节点是各种计算资源的通用名称,主要包括处理器和设备两种类型,两者的区别是处理器能够执行程序的硬件构件(如计算机主机),而设备是一种不具备计算能力的硬件构件(如打印机)。UML中使用三维立方体来表示节点,节点的名称位于立方体的顶部。

24

顺序图

  顺序图是 显示具体用例(或者是用例的一部分)的详细流程,并且显示流程中不同对象之间的调用关系,同时还可以很详细地显示对不同对象的不同调用。顺序图描述了对象之间的交互,重点在于描述消息及其时间顺序。

  顺序图有两个维度:

  • 垂直维度:以发生的时间顺序显示消息/调用的序列
  • 水平维度:显示消息被发送到的对象实例

  顺序图的关键在于对象之间的消息,对象之间的消息传递就是所谓的消息发送,消息通常变现为对象调用另一个对象的方法或方法的返回值,发送者和接受者之间的箭头表示消息。顺序图的顶部每个框表示每个类的实例(对象),框中的类实例名称和类名称之间用冒号或空格来分隔。如果某个类实例向另一个类实例发送一条消息,则绘制一条指向接收类实例的带箭头的连线,并把消息/方法的名称放在连线上面。对于某些特别重要的消息,还可以绘制一条带箭头的指向发起类实例的虚线,将返回值标注在虚线上,绘制带返回值的消息可以使得序列图更易于阅读:

25

  当绘制顺序图时,消息可以向两个方向扩展,消息穿梭在顺序图中,通常应该把消息发送者与接收者相邻摆放,尽量避免消息跨越多个对象。对象的激活期不是其存在的时间,而是它占据 CPU 的执行时间,绘制顺序图时,激活期要精确。顺序图主要是帮助开发者对某个用例的内部执行清晰化,当需要考察某个用例内部若干对象行为时,应使用顺序图,顺序图擅长表现对象之间的协作顺序,不擅长表现行为的精确定义。

活动图

  活动图和状态机图都被称为演化图:

  • 活动图:用于描述用例内部的活动或方法的流程,如果除去活动图中的并行活动描述,它就变成流程图
  • 状态机图:描述某一对象生命周期中需要关注的不同状态,并会详细描述刺激对象状态改变的事件,以及对象状态改变时所采取的动作

  演化图的 5 要素如下:

  • 状态:状态是对象相应事件前后的不同面貌,状态是某个时间段对象所保持的稳定态,目前的软件计算都是基于稳定态的,对象的稳定态是对象的固有特征,一个对象的状态一般是有限的。有限状态的对象是容易计算的,对象的状态越多,对象的状态迁移越复杂,对象状态可以想象成对象演化过程中的快照
  • 事件:来自对象外界的刺激,通常的形式是消息的传递,只是相对对象而言发生了事件。事件是对象状态发生改变的原动力
  • 动作:动作是对象针对所发生事件所做的处理,实际上通常表现为某个方法被执行
  • 活动:活动是动作激发的后续系统行为
  • 条件:条件指事件发生所需要具备的条件

  对于激发对象状态改变的事件,通常有如下两种类型:

  • 内部事件:从系统内部激发的事件,一个对象的方法(动作)调用(通过事件激活)另一个对象的方法(动作)
  • 外部事件:从系统边界外激发的事件,例如用户的鼠标、键盘动作

  活动图主要 用于描述过程原理、业务逻辑以及工作流技术。活动图非常类似于传统的流程图,它也使用圆角矩形表示活动,使用带箭头的实线表示事件;区别是活动图支持并发:

26

  从上图可以看出,如果将这个活动图的两支分开,每支就是一个传统的流程图,每个活动依次向下,遇到条件分支使用菱形框来表示条件。与传统的流程图不同的是,活动图可以使用并行分支分出多条并行活动。

  绘制活动图时以活动为中心,整个活动图只有一个开始活动,可以有多个结束活动。活动图需要将并行活动和串行活动分离,遇到分支和循环时最好像传统的流程图那样将分支、循环条件明确表示。活动图最大优点在于支持并行行为,并行对于工作流建模和过程建模非常重要。所以有了并行,因此需要进行同步,同步通过汇合来指明。

状态机图

  状态机图 表示某个对象所处的不同状态和该类的状态转换信息,实际上,通常只对"感兴趣"对象绘制状态机图。也就是说,在系统活动期间具有三个或更多潜在状态的对象才需要使用状态机图进行描述。状态机图的符号集包括 5 个基本元素:

  • 初始状态,使用实心圆来绘制
  • 状态之间的转换,使用具有带箭头的线段来绘制
  • 状态,使用圆角矩形来绘制
  • 判断点,使用空心圆来绘制
  • 一个或多个终止点,使用内部包含实心圆的圆来绘制

  要绘制状态机图,首先绘制起点和一条指向该类的初始状态的转换线段。状态本身可以在图中的任意位置绘制,然后使用状态转换线段将它们连接起来。

27

  绘制状态机图时应该保证对象只有一个初始状态,可以有多个终结状态。状态要表示对象的关键快照,有重要的实际意义,无关紧要的状态则无须考虑,绘制状态机图时事件和方法要明确。状态机图擅长表现单个对象的跨用例行为,对于多个对象的交互行为应该考虑采用顺序图,不要对系统的每个对象都画状态机图,只要对真正需要关心各个状态的对象才绘制状态机图。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值