UML---类图

     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中的操作

原文地址:https://www.cnblogs.com/shootercheng/p/5415516.html