关闭

类与类之间的关系

123人阅读 评论(0) 收藏 举报
分类:

类与类之间的关系对于理解面向对象具有很重要的作用,以前在面试的时候也经常被问到这个问题,在这里我就介绍一下。

 

类与类之间存在以下关系:

     (1)泛化(Generalization)

     (2)关联(Association)

     (3)依赖(Dependency)

     (4)聚合(Aggregation)

 

UML图与应用代码例子:

1.泛化(Generalization)

[泛化]

表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。一般化的关系是从子类指向父类的,与继承或实现的方法相反。

[具体表现]

父类 父类实例=new 子类()

[UML](1.1)

类与类之间的关系  - 夏天来临的日子 - 我的主打歌_我的青春我做主

1.1 Animal类与Tiger,Dog类的泛化关系

[代码表现]

  1. class Animal{}   
  2. class Tiger extends Animal{}   
  3. public class Test   
  4. {   
  5.      public void test()   
  6.      {   
  7.          Animal a=new Tiger();   
  8.      }   
  9. }

 

2.依赖(Dependency)

[依赖]

对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。

[具体表现]

依赖关系表现在局部变量,方法的参数,以及对静态方法的调用

[现实例子]

比如说你要去拧螺丝,你是不是要借助(也就是依赖)螺丝刀(Screwdriver)来帮助你完成拧螺丝(screw)的工作

[UML表现](1.2)

类与类之间的关系  - 夏天来临的日子 - 我的主打歌_我的青春我做主

1.2 Person类与Screwdriver类的依赖关系

[代码表现]

 

  1. public class Person{   
  2.      /** 拧螺丝 */  
  3.      public void screw(Screwdriver screwdriver){   
  4.          screwdriver.screw();   
  5.      }   
  6. }  

 

3.关联(Association)

[关联]

对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。

[具体表现]

关联关系是使用实例变量来实现

[现实例子]

比如客户和订单,每个订单对应特定的客户,每个客户对应一些特定的订单;再例如公司和员工,每个公司对应一些特定的员工,每个员工对应一特定的公司

[UML] (1.3)

类与类之间的关系  - 夏天来临的日子 - 我的主打歌_我的青春我做主

1.3 公司和员工的关联关系

[代码表现]

publicclass Employee

{

   public void startWorking()

   {

   

   }

}

  1. public class Company
    {
        private Employee employee;
        public Employee getEmployee()
        {
            return employee;
        }
        public void setEmployee(Employee employee)
        {
            this.employee = employee;
        }
        //
    公司运作   
        public void run()
        {
            employee.startWorking();
        }
    }

 

(4)聚合(Aggregation

[聚合]

当对象A被加入到对象B中,成为对象B的组成部分时,对象B和对象A之间为聚集关系。聚合是关联关系的一种,是较强的关联关系,强调的是整体与部分之间的关系。

[具体表现]

与关联关系一样,聚合关系也是通过实例变量来实现这样关系的。关联关系和聚合关系来语法上是没办法区分的,从语义上才能更好的区分两者的区别。

[关联与聚合的区别]

(1)关联关系所涉及的两个对象是处在同一个层次上的。比如人和自行车就是一种关联关系,而不是聚合关系,因为人不是由自行车组成的。

聚合关系涉及的两个对象处于不平等的层次上,一个代表整体,一个代表部分。比如电脑和它的显示器、键盘、主板以及内存就是聚集关系,因为主板是电脑的组成部分。

(2)对于具有聚集关系(尤其是强聚集关系)的两个对象,整体对象会制约它的组成对象的生命 周期。部分类的对象不能单独存在,它的生命周期依赖于整体类的对象的生命周期,当整体消失,部分也就随之消失。比如张三的电脑被偷了,那么电脑的所有组件 也不存在了,除非张三事先把一些电脑的组件(比如硬盘和内存)拆了下来。

   举一个简单的例子:

            一个图书馆可以有十万本书,也可以一本也没有。但空的图书馆还是图书馆。这是聚合

            一个车(我们平常能看到的普通的交通工具车)有轮子,有的车是四轮子的,有的车是三轮的,自行车是二轮的,还有独轮车,但车至少要有一个轮子,不然就不是车。这是组合关系。

[UML](1.4)

类与类之间的关系  - 夏天来临的日子 - 我的主打歌_我的青春我做主

1.3 电脑和组件的聚合关系

[代码表现]

 

  1. public class Computer{   
  2.      private CPU cpu;   
  3.      public CPU getCPU(){   
  4.          return cpu;   
  5.      }   
  6.      public void setCPU(CPU cpu){   
  7.          this.cpu=cpu;   
  8.      }   
  9.      //开启电脑   
  10.      public void start(){   
  11.          //cpu运作   
  12.          cpu.run();   
  13.      }  

 

 

 

 

类之间的关系有五种:继承、依赖、关联、聚合、组合

 

1.继承

指的是一个类(称为子类)继承另外的一个类(称为基类)的功能,并增加它自己的新功能的能力,继承是类与类之间最常见的关系。这个很好理解,没什么可讲的。

 

2.依赖

可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B作为参数被类A在某个method方法中使用;

 

 

3.关联(Association)

这体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;

 

 

4.聚合aggregation

聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;

 

5.组合Composition

组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;

 

6.依赖、关联、聚合、组合之间的区别

几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖;

 

聚合和组合的区别在于:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。

 

关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的,例如一个公司包含了很多员工,其实现上是差不多的。聚合和组合的区别则在语义和实现上都有差别,组合的两个对象之间其生命期有很大的关联,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,例如一个文档的版本,必须依赖于文档的存在,也只能属于一个文档。聚合则不一样,被聚合的对象可以属于多个聚合对象,例如一个员工可能可以属于多个公司。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3048次
    • 积分:77
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:14篇
    • 译文:0篇
    • 评论:0条
    文章分类