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

  • 相关阅读:
    【Qt开发】 V4L2_CAP_VIDEO_OVERLAY与V4L2_CAP_VIDEO_CAPTURE的区别
    【Qt开发】QThread 实用技巧、误区----但文档中没有提到
    【Qt开发】QThread 实用技巧、误区----但文档中没有提到
    【Qt开发】事件循环与线程 二
    【Qt开发】事件循环与线程 二
    【Qt开发】事件循环与线程 一
    【Qt开发】事件循环与线程 一
    【Qt开发】QThread介绍
    【Qt开发】QThread介绍
    【Linux开发】如何查看Linux kernel的内置模块驱动列表和进程ID
  • 原文地址:https://www.cnblogs.com/shootercheng/p/5415516.html
Copyright © 2020-2023  润新知