类与对象
UML中类是一组具有相同属性、操作、关系和语义的对象描述。而对象则是类的一个实例。
通常类的表示为具有3个栏目的矩形,每个栏目从上到下分别代表类名、属性和操作。如图1-1所示。
其中,类名使用黑体字,以大写字母开始,位于第一栏的中央。
类还可以是抽象类,抽象类的类名采用斜体字。
1.属性结构
在一个类中,表达属性的默认语法为:
[可见性]属性名[’:’类型][’[‘多重性’]]’][’=’初始值][{‘,’性质串}]
例如:
+age:int=18; -表示公开的、属性名为age、类型为int、初始值为18
-isTeacher:Boolean=false -表示私有的、属性名为isTeacher、类型为布尔值、初始值为false
- 可见性:指明该属性是否可以被其他类所使用。
- +公开的。 该属性可供其他类使用
- #受保护的。该属性只有其子类才能使用
- -私有的。 该属性只有本类的操作才能使用
- ~包内的。 该属性只有在同一包中声明的类才能使用
- 属性名: 属性名是一个表示属性名字的标识串,通常以小写字母开头,左对齐。
- 类型: 类型是对属性实现类型的规约,与具体实现语言有关。
例如:
name:String - 多重性:用于表达属性值的数目,即该类实例的这一特性可以具有的值的范围。
例如:
cars[3]]:int -表明该属性拥有3个值
name[0..1]]String -表明该属性可以为空值,最多拥有一个值
默认省略的情况下,意指多重性为1. .1,即属性只含有一个值。 - 初始值: 初始值是与语言相关的表达式,用于为新创建的对象赋予初始值
- 性质串: 如果说上面几种声明都是围绕一个属性的取值而给出的,那么‘性质串’则是为了表达该属性所具有的性质而给出的。
例如:
age:int=18{frozen}
其中,‘frozen’是一个性质串,表示属性age的值是不可改变的。如果没有对一个属性给出这一性质串,那么就认为该属性是可以改变的。
和其他计算机语言一样,属性也有作用范围,在UML中,将属性分类2大类,即类范围属性和对象范围属性。所谓类范围的属性指的是该属性被该类所有对象所共享,在UML中,通过在属性名和类型表达式之下画出一条线段的方式,表示该属性是类范围的属性。如图1-2.
2.类的操作
操作是对一个类中所有对象要做的事情的抽象。
同属性一样,操作也有其完整的语法:
[可见性]操作名’(‘参数表’)’[’:’返回类型][性质串{‘,’性质串}]
例如:
run 操作名
+run(speed:int) 可见性和操作名和参数
say():string 操作名和返回类型
say(){gaurded} 操作名和特性
- 可见性:同属性可见性
- 操作名:通常是以小写字母开头的动词或动词短语,如果是动词短语的话,除第一个字母外,其余每个词的第一个字母为大写,若操作是一个抽象操作,则以斜体字表示。
- 参数表:参数表是表示用于给出该操作的参数。一个操作也可以没有参数。
- 语法:[方向]参数名:类型[=默认值]
- 这里的方向指的是对输入/输出的规约,其取值有以下几种:
- in 输入参数,不能修改
- inout 输入参数,可修改
- out 输出参数,可修改
- 这里的方向指的是对输入/输出的规约,其取值有以下几种:
- 语法:[方向]参数名:类型[=默认值]
- 性质串:UML提供了几个标准的性质值:
- leaf:指明该操作是‘叶子’操作
- abstract:指明该操作上抽象操作
- sequential:指明在该类对象中,一次仅有一个控制流。当出现多个控制流时,就不能保证该对象的语义和完整性。
- guarded:指明执行该操作的条件,实现操作调用的顺序化,即一次只能调用对象的一个操作,以保证在出现多控制流的情况下,对象具有的语义和完整性
- concurrent:指明来自并发控制流的多个调用可以同时作用于一个对象的任何一个并发操作,而所有操作均能正确的语义并发进行。
- static:指明该操作没有关于目标对象的隐式参数,其行为如同传统的全局过程。
类与对象的几种表示法
在实际使用中,可以把一个类表达成如下图3中形式。
其中左上角的只有一个类名,左下角显示了类的一定细节,右边的图显示了类的更多细节。
在实际使用中,可以把一个对象表达成如上图1-4中所示形式。