本章要点

  • 注释的重要性和用途
  • 单行注释语法和多行注释语法
  • 文档注释的语法和常用的javadoc标记
  • javadoc命令的用法
  • 掌握査看API文档的方法
  • 数据类型的两大类
  • 8种基本类型及各自的注意点
  • 自动类型转换
  • 强制类型转换
  • 表达式类型的自动提升
  • 直接量的类型和赋值
  • Java提供的基本运算符
  • 运算符的结合性和优先级

Java是强类型语言

Java语言是一门强类型语言。强类型包含两方面的含义:
①所有的变量必须先声明、后使用:
②指定类型的变量只能接受类型与之匹配的值。

强类型语言可以在编译过程中发现源代码的错误,从而保证程序更加健壮。

基本数据类型及其相互转换

Java语言提供了丰富的基本数据类型,例如整型、字符型、浮点型和布尔型等。
基本类型大致上可以分为两类:数值类型和布尔类型,其中数值类型包括整型、字符型和浮点型,所有数值类型之间可以进行类型转换,这种类型转换包括自动类型转换和强制类型转换。

运算符

Java语言还提供了一系列功能丰富的运算符,这些运算符包括所有的算术运算符,以及功能丰富的位运算符、比较运算符、逻辑运算符,这些运算符是Java编程的基础。将运算符和操作数连接在一起就形成了表达式

2.4 本章小结

本章主要介绍了面向对象的相关概念,也简要介绍了结构化程序设计的相关知识,包括结构化程序设计的基本特征以及存在的缺陷,还详细介绍了结构化程序设计的三种基本结构。
本章重点介绍了面向对象程序设计的相关概念,以及面向对象程序设计的三个基本特征,并简要介绍了Java语言对面向对象特征的支持。
本章详细介绍了UML的概念以及相关知识,并通过示例讲解了常用UML图形的绘制方法,这些UML图形是读者进行面向对象分析的重要方法,也是读者阅读本书后面章节的基础知识

2.3 Java的面向对象特征

Java是纯粹的面向对象编程语言,完全支持面向对象的三大基本特征:封装继承多态。**Java程序的组成单位就是**,不管多大的Java应用程序,都是由一个个类组成的。

2.3.1 一切都是对象

Java语言中,除8个基本数据类型值之外,一切都是对象,而对象就是面向对象程序设计的中心。对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。

成员变量 描述对象的 状态

对象具有状态,一个对象用数据值来描述它的状态。**Java通过为对象定义成员变量来描述对象的状态**;

方法 描述对象的 行为

对象还有操作,这些操作可以改变对象的状态,对象的操作也被称为对象的行为,Java通过为对象定义方法来描述对象的行为

对象实现了数据和操作的结合,对象把数据和对数据的操作封装成一个有机的整体,因此面向对象提供了更大的编程粒度,对程序员来说,更易于掌握和使用。
对象是Java程序的核心,所以Java里的对象具有唯一性,每个对象都有一个标识来引用它,如果某个对象失去了标识,这个对象将变成垃圾,只能等着系统垃圾回收机制来回收它。**Java语言不允许直接访问对象,而是通过对对象的引用来操作对象**。

2.3.2 类和对象

具有相同或相似性质的一组对象的抽象就是类,类是对一类事物的描述,是抽象的、概念上的定义;对象是实际存在的该类事物的个体,因而也称为实例(instance)。
对象的抽象化是类,类的具体化就是对象,也可以说类的实例是对象。类用来描述一系列对象,类概述每个对象应包括的数据,类概述每个对象的行为特征。因此,可以把类理解成某种概念、定义,它规定了某类对象所共同具有的数据和行为特征。
Java语言使用class关键字定义类,定义类时可使用成员变量来描述该类对象的数据,可使用方法来描述该类对象的行为特征。

类之间的结构关系

在客观世界中有若干类,这些类之间有一定的结构关系。通常有如下两种主要的结构关系

is a

一般到特殊关系:这种关系就是典型的继承关系,Java语言使用extends关键字来表示这种继承关系,Java的子类是一种特殊的父类。因此,这种一般到特殊的关系其实是一种“is a”关系。

has a

整体到部分结构关系:也被称为组装结构,这是典型的组合关系.

如何实现组合关系

Java语言通过在一个类里保存另一个对象的引用来实现这种组合关系。

因此,这种整体→部分结构关系其实是一种“has a”关系。

开发者定义了Java类之后,就可以使用new关键字来创建指定类的对象了,每个类可以创建任意多个对象,多个对象的成员变量值可以不同——这表现为不同对象的数据存在差异。

状态机图表示某个对象所处的不同状态和该类的状态转换信息。实际上,通常只对“感兴趣的”对象绘制状态机图。也就是说,在系统活动期间具有三个或更多潜在状态的对象才需要考虑使用状态机图进行描述。
未完待续…

顺序图显示具体用例(或者是用例的一部分)的详细流程,并且显示流程中不同对象之间的调用关系,同时还可以很详细地显示对不同对象的不同调用。顺序图描述了对象之间的交互(顺序图和通信图都被称为交互图),重点在于描述消息及其时间顺序。
顺序图有两个维度:
垂直维度,以发生的时间顺序显示消息/调用的序列;
水平维度,显示消息被发送到的对象实例。顺序图的关键在于对象之间的消息,对象之间的信息传递就是所谓的消息发送,消息通常表现为对象调用另一个对象的方法或方法的返回值,发送者和接收者之间的箭头表示消息。

未完待续…

现代的软件工程早已超岀早期的单机程序,整个软件系统可能是跨国家、跨地区的分布式软件,软件的不同部分可能需要部署在不同地方、不同平台之上。部署图用于描述软件系统如何部署到硬件环境中,它的用途是显示软件系统不同的组件将在何处物理运行,以及它们将如何彼此通信
未完待续…

2.2.3 组件图

对于现代的大型应用程序而言,通常不只是单独一个类或单独一组类所能完成的,通常会由一个或多个可部署的组件组成。
Java程序而言,可复用的组件通常打包成一个JARWAR等文件;
C/C++应用而言,可复用的组件通常是一个函数库,或者是一个DLL(动态链接库)文件。

组件图提供系统的物理视图,它的用途是显示系统中的软件对其他软件组件(例如,库函数)的依赖关系。组件图可以在一个非常高的层次上显示,仅显示系统中粗粒度的组件,也可以在组件包层次上显示。

未完待续…

类图是最古老、功能最丰富、使用最广泛的UML图。类图表示系统中应该包含哪些实体,各实体之间如何关联;换句话说,类图显示了系统的静态结构,类图可用于表示逻辑类,逻辑类通常就是业务人员所谈及的事物种类。

类图的图形表示

类在类图上使用包含三个部分的矩形来描述:

  • 最上面的部分显示类的名称,
  • 中间部分包含类的属性,
  • 最下面的部分包含类的方法。

图2.11显示了类图中类的表示方法。

类图除可以表示实体的静态内部结构之外,还可以表示实体之间的相互关系

类之间的三种基本关系

类之间有三种基本关系:

  • 关联(包括聚合、组合)
  • 泛化(与继承同一个概念)
  • 依赖

1. 关联

客观世界中的两个实体之间总是存在千丝万缕的关系,当把这两个实体抽象到软件系统中时,两个类之间必然存在关联关系。

单向关联

关联具有一定的方向性:如果仅能从一个类单方向地访问另一个类,则被称为单向关联;

双向关联

如果两个类可以互相访问对象,则被称为双向关联

多重性

一个对象能访问关联对象的数目被称为多重性,例如,建立学生和老师之间的单向关联,则可以从学生访问老师,但从老师不能访问学生。

关联图形表示

关联使用一条实线来表示,带箭头的实线表示单向关联

关联和属性的区别

在很多时候,关联和属性很像,关联和属性的关键区别在于:类里的某个属性引用到另外一个实体时,则变成了关联

聚合 组合

关联关系包括两种特例:聚合和组合,它们都有部分和整体的关系组合比聚合更加严格

  • 当某个实体聚合成另一个实体时,该实体还可以同时是另一个实体的部分

    • 例如,学生既可以是篮球俱乐部的成员,也可以是书法俱乐部的成员;
  • 当某个实体组合成另一个实体时,该实体则不能同时是另一个实体的部分

  • 聚合使用带空心菱形框的实线表示,

  • 组合则使用带实心菱形框的实线表示。

实例

图2.12显示了几个类之间的关联关系。

图2.12中描述TeacherStudent之间的关联关系:它们是双向关联关系,而且使用了多重性来表示TeacherStudent之间存在1:N的关联关系(1..*表示可以是一个到多个),即一个Teacher实体可以有1个或多个关联的Student实体;

StudentBasketBallClub存在聚合关系,即1个或多个Student实体可以聚合成一个BasketBallClub实体;

Arm(手臂)和Student之间存在组合关系,2个Arm实体组合成一个Student实体。

2. 泛化

泛化与继承是同一个概念,都是指子类是一种特殊的父类,类与类之间的继承关系是非常普遍的。

继承关系

继承关系使用**带空心三角形的实线**表示。图2.13显示了StudentPerson类之间的继承关系

从图2.13可以看出,StudentPerson的子类,即Student类是种特殊的Person类。

实现关系

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

3. 依赖

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

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

通常而言,依赖是单向的,尤其是当数据表现和数据模型分开设计时,数据表现依赖于数据模型。例如,JDK基础类库中的JTableDefaultAbleModel,关于这两个类的介绍请参考本书12.11节的介绍。图2.14显示了它们之间的依赖关系:

对于图2.14中表述的JTableDefaultTableModel两个类,其中DefaultTableModelJTable的数据模型,DefaultTableModel发生改变时,JTable将相应地发生改变

2.2 UML(统一建模语言)介绍

面向对象软件开发需要经过OOA(面向对象分析)、OOD(面向对象设计)和OOP(面向对象编程)三个阶段,

  • OOA对目标系统进行分析,建立分析模型,并将之文档化;
  • OOD用面向对象的思想对OOA的结果进行细化,得出设计模型。

OOAOOD的分析、设计结果需要统一的符号来描述、交流并记录,UML就是这种用于描述、记录OOAOOD结果的符号表示法

面向对象的分析与设计方法在20世纪80年代末至90年代中出现了一个高潮,UML是这个高潮的产物。在此期间出现了三种具有代表性的表示方法:

Booch 1993表示法

Booch是面向对象方法最早的倡导者之一,他提出了面向对象软件工程的概念。Booch 1993表示法(由Booch提出)比较适合于系统的设计和构造

面向对象的建模技术(OMT)方法

Rumbaugh等人提出了面向对象的建模技术(OMT)方法,采用面向对象的概念,并引入了各种独立于语言的表示符这种方法用对象模型、动态模型、功能模型和用例模型共同完成对整个系统的建模,所定义的概念和符号可用于软件开发的分析、设计和实现的全过程,软件开发人员不必在开发过程的不同阶段进行概念和符号的转换。OMT-2特别适用于分析和描述以数据为中心的信息系统

OOSE方法

Jacobson于1994年提出了OOSE方法,其最大特点是面向用例(Use-Case),并在用例的描述中引入了外部角色的概念。用例的概念是精确描述需求的重要武器,但用例贯穿于整个开发过程,包括对系统的测试和验证。OOSE比较适合支持商业工程和需求分析

UML

UML统一了BoochRumbaughJacobson的表示方法,而且对其进行了进一步的发展,并最终统一为大众所接受的标准建模语言。UML是一种定义良好、易于表达、功能强大且普遍适用的建模语言,UML的作用域不限于支持面向对象的分析与设计,还支持从需求分析开始的软件开发全过程

截至1996年10月,UML获得了工业界、科技界和应用界的广泛支持,已有700多家公司表示支持釆用UML作为建模语言。1996年年底,UML已稳占面向对象技术市场的85%,成为可视化建模语言事实上的工业标准。1997年年底,OMG组织(Object Management Group,对象管理组织)采纳UML1.1作为基于面向对象技术的标准建模语言UML代表了面向对象方法的软件开发技术的发展方向,目前UML的最新版本是2.0,UML的大致发展过程如图2.8所示。

图2.8中的UML 1.1UML 2.0UML历史上两个具有里程碑意义的版本,其中,UML 1.1OMG正式发布的第一个标准版本,而UML 2.0是目前最成熟、稳定的UML版本。

UML分类

UML图大致上可分为静态图动态图两种,UML 2.0的组成如图2.9所示。

UML2.0 13种图形

从图2.9可以看出,UML2.0一共包括13种正式图形:

  1. 活动图(activity Diagram)、
  2. 类图(class Diagram)
  3. 通信图(communication Diagram,对应于UML 1.x中的协作图)、
  4. 组件图(componentDiagram)、
  5. 复合结构图(composite Structure Diagram,UML2.0新增)、
  6. 部署图(deployment Diagram)、
  7. 交互概观图(Interactive overview Diagram,UML2.0新增)、
  8. 对象图(object Diagram)、
  9. 包图(package Diagram)、
  10. 顺序图(sequence Diagram)、
  11. 状态机图(state Machine Diagram)、
  12. 定时图(timing Diagram,UML2.0新增)、
  13. 用例图(use Case Diaagram)

最常用的UML

最常用的UML图包括用例图类图组件图部署图顺序图活动图状态机图等。

2.2.1 用例图

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

用例图构成

用例图包括

  • 用例
  • 角色
  • 角色和用例之间的关系,
  • 用例之间的关系

图形表示

  • 用例(以一个椭圆表示,用例的名称放在椭圆的中心或椭圆下面)
  • 角色(Actor,也就是与系统交互的其他实体,以一个人形符号表示)
  • 关系(以简单的线段来表示)

用例图一般表示出用例的组织关系
要么是整个系统的全部用例,
要么是完成具体功能的一组用例。

图2.10是一个简单的BBS系统的部分用例示意图。

用例图通常用于表达系统或者系统范畴的高级功能。
如图2.10所示,可以很容易看出该系统所提供的功能。这个系统

  • 允许注册用户登录、发帖和回复,其中发帖和回复需要依赖于登录;
  • 允许管理员删除其他人的帖子,删帖也需要依赖于登录

用例图 用在 需求分析阶段

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