zoukankan      html  css  js  c++  java
  • 面向对象中类和类的关系

    在面向对象方法中,我们在确定了类及类的属性和方法后。不可避免的要研究类和类之间的关系,正是这些关系将整个事情串联起来。使彼此之间有了联系,就像现实生活中,人与人交往中存在着不同的关系。

    了解这些关系,对于我们开发系统百利而无一害,能够让我们轻松、高效的工作,相同像我们在日常生活中处理好人与人之间的关系。会给我们带来巨大的优点。那么我们就来认识一下。面向对象中类与类之间有那些关系。

    类和类之间的关系大概能够分为一下几种类型:泛化关系(Generalization)、实现关系(realization)、依赖关系(Dependency)、关联关系(Association)(关联、聚合(Aggregation)、组合(Composition))。

    泛化关系和实现关系体现的是一种类和类、或者类和接口间的关系。不存在引用,归结为纵向关系。依赖关系和关联关系体现的是类和类、类与接口间的引用。归结为横向关系。

    一、泛化关系

    泛化关系是一个类(子类、子接口)继承另外的一个类(父类、父接口)的功能,而且能够有自己的新功能。也既是我们所说的继承关系。在java中通过extends来标识。在UML中用一条带空心箭头的实现表示,从子类指向父类,或者子接口指向父接口。

     代码例如以下:
       Class _A{}
       Class _B extends _A{}
       Public class Test{
          Public static void main(String args[]){
             _A  a = new _B();
          }
       }
    

    二、实现关系

    实现关系指的是class类实现interface接口(能够使多个接口)。在java中用implements标识,在UML中用一条带空心三角箭头的虚线标识,从类指向实现的接口。


    代码例如以下:
    Interface  A{}
    Class  B  implements  A{}
    Public class Test{
          Public static void main( String args[] ){
             B  b = new B();
          }
       }
    

    说明:以上泛化和实现为一对,两者都用空心三角形。继承关系比实现接口关系耦合性强,  所以继承用实线,实现接口用虚线

    三、依赖关系

    依赖关系是类与类之间的连接. 表示一个类依赖于还有一个类的定义. 依赖关系总是单向 。依赖是类的五种关系中耦合最小的一种关系。

    由于依赖关系在生成代码的时候,这两个关系类都不会添加属性。这样的微弱的关系能够用类之间的相互了解的程度来说明。java . 依赖关系体现为: 局部变量, 方法中的參数, 和对静态方法的调用.

    UML中。依赖关系用由类A指向类B的带箭头虚线表示。


    代码例如以下所看到的:

    Class  A{ }
    Class  B{ }
    

    依赖关系表现形式一:

    A类是B类的某个方法中的变量,则B类能够调用它。代码例如以下:

    Class B{
       Public void info(){
         Private A a;
       }
    } 
    

    :B有一个info方法,A类作为该方法的变量来使用。

    A类的生命期。它是当B类的info方法被调用的时候,才被实例化。

    依赖关系表现形式二

    A类是作为B类中某个方法的參数或者返回值时,代码例如以下:

    Class  B {
       Public  A  info( A  a){ 
          Return null;
       }
    }
    

    依赖关系表现形式三:

    A类中有一个是静态方法,B类能够调用它

    无用多说。A类被B类的一个方法持有。生命期随着方法的运行结束而结束。

    四、关联关系

        关联体现的是两个类之间语义级别的一种强依赖关系。这样的关系比依赖更强、不存在依赖关系的偶然性、关系也不是暂时性的。通常是长期性的,它使一个类知道还有一个类的属性和方法。并且两方的关系通常是平等的。关联能够是单向、双向的。java 语言中关联关系是使用实例变量实现的。

    UML中,关联关系用由关联类A指向被关联类B的带箭头实线表示,在关联的两端能够标注关联两方的角色和多重性标记。

    单向关联例如以下:


    Class  A { }
    Class  B { 
       Public  A  a;  
    }
    

    双向关联例如以下:

    Class  A {
       Public  B  b;
     }
    Class  B { 
       Public  A  a;  
    }
    

    说明:依赖和关联的差别:

    ①从类的属性是否添加的角度看:

    发生依赖关系的两个类都不会添加属性。当中的一个类作为还有一个类的方法的參数或者返回值,或者是某个方法的变量而已。

    发生关联关系的两个类,当中的一个类成为还有一个类的属性,而属性是一种更为紧密的耦合,更为长久的持有关系。

    ②从关系的生命期角度看:

    依赖关系是仅当类的方法被调用时而产生。伴随着方法的结束而结束了。

    关联关系是当类实例化的时候即产生。当类销毁的时候。关系结束。

    相比依赖讲,关联关系的生存期更长。

    由于,关联关系比依赖关系耦合性强,所以,关联关系用实线。依赖关系用虚线。

    关联关系经过细化,还存在两种特例:聚合和组合。

    (1)聚合关系:是总体和个体之间的关系,即has-a的关系,此时总体与部分之间是可分离的。他们能够具有各自的生命周期,部分能够属于多个总体对象,也能够为多个总体对象共享;表如今代码层面,和关联关系是一致的,仅仅能从语义级别来区分。从java 语法上是分不出关联和聚合的。

    在UML中。聚合关系以空心菱形加实线箭头表示。


    代码例如以下:

    Class B { }
    Class A{
       Public  B  b;
       A (B  b){
         This.b = b;
         }
    }
    

    注意:关联关系中两个类是处于同样的层次, 而聚合关系中两不类是处于不平等的层次, 一个表示总体, 一个表示部分。

    (2)组合关系: 体现的是一种contains-a的关系,这样的关系比聚合更强。也称为强聚合;他相同体现总体与部分间的关系,但此时总体与部分是不可分的,总体的生命周期结束也就意味着部分的生命周期结束;比方你和你的大脑;合成关系不能共享. 。

    表如今代码层面,和关联关系是一致的,仅仅能从语义级别来区分。在UML中,组合关系以实心菱形加实线箭头表示。


    代码例如以下:

    Class B { }
    Class A{
       Public  B  b;
       A (){
         b = new Wings();
         }
    }
    

    注意:这两种关系的差别在于

    ①构造函数不同

    聚合类的构造函数中包括了还有一个类作为參数。A的构造函数中要用到B作为參数传递进来。

    A能够脱离雁群类而独立存在。

    组合类的构造函数中包括了还有一个类的实例化。

    表明A在实例化之前,一定要先实例化B,这两个类紧密的耦合在一起,同生共灭。

    B类是不能够脱离A类而独立存在

    信息的封装性不同

    在聚合关系中,client能够同一时候了解A类和B类,由于他们都是独立的

    而在组合关系中,client仅仅认识A类,根本就不知道B类的存在,由于B类被严密的封装在A中。

    ③生命周期不同:

    聚合是总体与部分之间是可分离的,他们能够具有各自的生命周期。不会由于一方的消失还有一方跟着消失。

    聚合是总体与部分是不可分的,总体的生命周期结束也就意味着部分的生命周期结束。







  • 相关阅读:
    中国区 Azure 服务和定价模式概述
    云计算的那些「What」
    【虚拟机-可用性集】ARM 中可用性集使用的注意事项
    【虚拟机-可用性集】将虚拟机添加到可用性集中
    【虚拟机-远程连接】Azure Linux 虚拟机常见导致无法远程的操作
    【虚拟机-远程链接】Azure Windows 虚拟机常见导致无法远程的操作
    【虚拟机-网络IP】使用 Powershell 设置 VNET 中的静态 IP
    matlab的diff()函数
    matlab的拟合函数polyfit()函数
    解决Python各种no module named "XX"的问题
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7096570.html
Copyright © 2011-2022 走看看