UML具有面向对象的特点,这点和面向对象语言相似,比如Java语言,Java中的类、继承、接口都可以在类图中体现出来。类图定义了一组具有描述状态和行为的对象,这些对象具有相同的属性、操作、关系和语义,而类与类之间包含依赖、泛化、实现和关联这四种关系
类
类的名称
每一个类都有一个名称,它不能省略,该名称用于区分其他类
类的属性
属性描述了类在软件系统中代表事物(即对对象)。类可以有任意数量的属性,也可以没有属性
公共属性
在类图中标记为“+”或者public,则为公共属性,可以被外部对象访问
保护属性
在类图中标记为"#"或者protected,则为保护属性,可以被本类或子类的对象访问
私有属性
在类图中标记为"-"或者private,则为私有属性,不可以被类外部对象访问,只能为本类对象使用
类的操作
类中可以包含操作,对数据的具体处理方法的描述则放在操作部分,操作说明了该类能做些什么工作。操作通常称为函数或方法,这和Java的类中可以定义方法相似 。类中可以有操作,也可以没操作。类的操作包括可见性、操作名、参数列表、返回类型和属性字符串。
可见性
操作的可见性描述了该操作是否对于其他类可见,是否可以被其他类调用。操作的可见性和属性的可见性一样,可以使用private、protected和public等关键字来修饰
操作名
每个操作都必须有一个名称以区别于类中的其他操作。操作名的表示方法与属性一样,也是第一个字母小写,当操作名中包含多个单词是,第二个单词大写
参数列表
参数列表是操作或方法被调用时接收传递过来的参数值的标量。参数列表是可选择的,可以没有,也可以有一个或多个
返回类型
返回类型指定了有操作返回的数据类型
属性字符串
属性字符串用来附加一些关于操作的除了预定义元素之外的信息,从而方便对操作的一些内容进行说明
Book类的分析:
如上图的类有4个属性,booklsdn为私有属性,是String型,bookName为保护属性,是String型,bookPrice为共有属性,是double型,其初始值为45.8
有两个操作,分别是addBook、getBookList,它们都是共有的,addBook()返回值是int型的,getBookList()返回值是String型的。
接口
一个类中只能有一个父类,即类只能继承另外一个类,这点和Java语言相似,但是使用接口可以继承或实现多个类。使用接口可以避免许多与多重继承相关的问题
抽象类
有具体对象的类称为具体类,具体类中的操作都有具体实现的方法。抽象类与具体类相反,它是指没有具体对象的类。抽象类是指一个类只提供操作名,而不对其进行实现。简单地说,抽象类就是不能被实例化的类,一般至少包含一个操作
举一个简单的例子
//Java代码
1 interface I1{ 2 void methodI1(); //public static by default 3 } 4 5 interface I2 extends I1{ 6 void methodI2(); //public static by default 7 } 8 9 class A1{ 10 public String methodA1(){ 11 String strA1 = "I am in methodC1 of class A1"; 12 return strA1; 13 } 14 15 public String toString(){ 16 return "toString() method of class A1"; 17 } 18 } 19 class B1 extends A1 implements I2{ 20 public void methodI1(){ 21 System.out.println("I am in methodI1 of class B1"); 22 } 23 24 public void methodI2(){ 25 System.out.println("I am in methodI2 of class B1"); 26 } 27 } 28 29 class C1 implements I2{ 30 public void methodI1(){ 31 System.out.println("I am in methodI1 of class C1"); 32 } 33 34 public void methodI2(){ 35 System.out.println("I am in methodI2 of class C1"); 36 } 37 } 38 39 // Note that the class is declared as abstract as it does not 40 //satisfy the interface contract 41 abstract class D1 implements I2{ 42 public void methodI1() { 43 } 44 45 //This class does not implement methodI2() hence declared abstract. 46 47 } 48 public class InterFaceEx{ 49 public static void main(String[] args){ 50 I1 i1 = new B1(); 51 i1.methodI1(); //OK as methodI1 is present in B1 52 // i1.methodI2(); Compilation error as methodI2 not present in I1 53 54 // Casting to convert the type of the reference from type I1 to type I2 55 ((I2)i1).methodI2(); 56 57 I2 i2 = new B1(); 58 i2.methodI1(); //OK 59 i2.methodI2(); //OK 60 61 // Does not Compile as methodA1() not present in interface reference I1 62 // String var = i1.methodA1(); 63 64 //Hence I1 requires a cast to invoke methodA1 65 66 String var2 = ((A1)i1).methodA1(); 67 System.out.println("var2 : "+var2); 68 String var3 = ((B1)i1).methodA1(); 69 System.out.println("var3 : "+var3); 70 String var4 = i1.toString(); 71 System.out.println("var4 : "+var4); 72 String var5 = i2.toString(); 73 System.out.println("var5 : "+var5); 74 75 I1 i3 = new C1(); 76 String var6 = i3.toString(); 77 System.out.println("var6 : "+var6); //It prints the Object toString() method 78 79 Object o1 = new B1(); 80 // o1.methodI1(); does not compile as Object class does not define methodI1() 81 //To solve the probelm we need to downcast o1 reference. We can do it in the following 4 ways 82 ((I1)o1).methodI1(); //1 83 ((I2)o1).methodI1(); //2 84 ((B1)o1).methodI1(); //3 85 86 /* 87 * B1 does not have any relationship with C1 except they are "siblings". 88 * Well, you can't cast siblings into one another. 89 */ 90 // ((C1)o1).methodI1(); Produces a ClassCastException 91 92 93 94 } 95 }
使用StarUML工具生成的类图
类图分析:
接口: I1、I2
类: A1、B1、C1、InterFaceEX
抽象类: D1
关系: B1继承A1,也就是UML中的泛化关系,图形上表示有一个三角形箭头
类B1、C1、D1实现接口中的方法
类InterFaceEx中有一个main(Java程序的入口),也就是UML中的操作