zoukankan      html  css  js  c++  java
  • 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中的操作

  • 相关阅读:
    线段树专辑—— pku 1436 Horizontally Visible Segments
    线段树专辑——pku 3667 Hotel
    线段树专辑——hdu 1540 Tunnel Warfare
    线段树专辑—— hdu 1828 Picture
    线段树专辑—— hdu 1542 Atlantis
    线段树专辑 —— pku 2482 Stars in Your Window
    线段树专辑 —— pku 3225 Help with Intervals
    线段树专辑—— hdu 1255 覆盖的面积
    线段树专辑—— hdu 3016 Man Down
    Ajax跨域访问
  • 原文地址:https://www.cnblogs.com/shootercheng/p/5415516.html
Copyright © 2011-2022 走看看