对象导论以及对象之间的几种关系的总结
来源:互联网 发布:德拉诺飞行软件 编辑:程序博客网 时间:2024/05/21 17:28
Java语言的面向对象
抽象过程
- 万物皆为对象,将对象视为奇特的变量,可以存储数据,还可以对自身进行操作
- 程序是对象的集合,他们通过发送消息来告知彼此所要做的—–>(可以理解为你调用我,我调用你)
- 每个对象都有自己的由其他对象所构成的存储 (对象可以包含其他对象)
- 每个对象都用其类型(每一个对象都有其对应的一个类型)
- 某一特定类型的所有的对象都可以接收同样的消息
每一个对象都有一个接口
- 类描述具有相同特性(数据元素)和行为(功能)的对象集合,所以一个类实际上就是一个数据类型
- 接口可以看作是一组功能需求和常量的集合
为什么有了类还要设计出类这个概念呢?
- 第一:Java语言只能支持单继承,单根继承结构保证所有对象都具备某些功能,也容易在堆上创建,垃圾回收器的实现容易的多
- 第二:是我个人的观点,例如两类事物的属性完全不同,但是却可以同一个相同的操作,虽然也可以也可以用更抽象的类表示,也可以将这一行为操作定义为接口。但是:A不同于B,B不同于C,A不同于C,但是A和B可以做想用操作p1,B可以和C做相同操作p2。但是或许接口在某些时候会发挥更好的效果。
每个对象都提供服务
每个对象都有他自身的方法,这些方法就是你可以提供的服务。
继承和多态
多态的实现主要是靠方法的覆盖重写来实现的。
Java面向对象的UML关系主要有如下:
- 继承/泛化
- 实现
- 单向依赖
- 双向依赖
- 单向关联
- 双向关联
- 聚合
- 组合
表示符号如下所示:
1.继承/泛化
是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议性。
【箭头指向】:带三角箭头的实线,箭头指向父类
2.实现
是一种类与接口的关系,表示类是接口所有特征和行为的实现. 一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性;
【箭头指向】:带三角箭头的虚线,箭头指向接口
3.依赖
是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖. 一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A;比如某个老师要授课,则需要有这么一门课让他教授,此时老师与课之间的关系就是依赖;
【代码表现】:局部变量、方法的参数或者对静态方法的调用
【箭头及指向】:带箭头的虚线,指向被使用者
4.关联
是类与类之间的联接,它使一个类知道另一个类的属性和方法。两个类或者类与接口之间语义级别的一种强依赖关系,这种关系比依赖更强,一般是长期性的,而且双方的关系一般是平等的。比如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
【代码体现】:成员变量/全局变量
【箭头及指向】:带普通箭头的实心线,指向被拥有者
5.聚合
关联关系的一种特例, 是强的关联关系. 聚合是整体与部分的关系,且部分可以离开整体而单独存在,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享,比如计算机与CPU、公司与员工、车和轮胎的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;
聚合关系也是使用实例变量实现的. 从java 语法上是分不出关联和聚合的. 关联关系中两个类是处于相同的层次, 而聚合关系中两不类是处于不平等的层次, 一个表示整体, 一个表示部分.
【代码体现】:成员变量/全局变量
【箭头及指向】:带空心菱形的实心线,菱形指向整体
6.组合
是关联关系的一种特例,是比聚合关系还要强的关系,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如:公司和部门是整体和部分的关系,没有公司就不存在部门合成关系不能共享。
组合跟聚合几乎相同,唯一的区别就是”部分”不能脱离”整体”单独存在,就是说,”部分”的生命期不能比”整体”还要长。
【代码体现】:成员变量/全局变量
【箭头及指向】:带实心菱形的实线,菱形指向整体
各种关系的强弱顺序:
泛化=实现>组合>聚合>关联>依赖
###综合比较
1.聚合与组合
(1)聚合与组合都是一种结合关系,只是额外具有整体-部分的意涵。
(2)部件的生命周期不同
聚合关系中,整件不会拥有部件的生命周期,所以整件删除时,部件不会被删除。再者,多个整件可以共享同一个部件。
组合关系中,整件拥有部件的生命周期,所以整件删除时,部件一定会跟着删除。而且,多个整件不可以同时间共享同一个部件。
(3)聚合关系是”has-a”关系,组合关系是”contains-a”关系。
2.关联和聚合
(1)表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
(2)关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的。
(3)关联是一种结构化的关系,指一种对象和另一种对象有联系。
(4)关联和聚合是视问题域而定的,例如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。
3.关联和依赖
(1)关联关系中,体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。
(2)依赖关系中,可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。
4.综合比较
这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:
组合>聚合>关联>依赖
代码的体现
依赖
class Car { public static void run(){ System.out.println("汽车行驶中"); } } class Driver { //使用形参方式发生依赖关系 public void drive1(Car car){ car.run(); } //使用局部变量发生依赖关系 public void drive2(){ Car car = new Car(); car.run(); } //使用静态变量发生依赖关系 public void drive3(){ Car.run(); } }
关联关系
class Driver { //使用成员变量形式实现关联 Car mycar; public void drive(){ mycar.run(); } ... //使用方法参数形式实现关联 public void drive(Car car){ car.run(); } }
聚合关系
class Driver { //使用成员变量形式实现聚合关系 Car mycar; public void drive(){ mycar.run(); } }
组合关系
语义如:新建一辆车必须要新建四个轮子,没有轮子就不是车,车离开轮子也开动不了
public Car(Wheel wheel){ carWheel = wheel; }
总结
关联、聚合、组合只能配合语义,结合上下文才能够判断出来,而只给出一段代码让我们判断是关联,聚合,还是组合关系,则是无法判断的。
- 对象导论以及对象之间的几种关系的总结
- 类、对象,以及它们之间的关系
- 面向对象--类与类之间的几种关系
- 对象之间的关系
- 对象之间的关系
- 对象之间的关系
- 对象之间的关系
- UML类图,以及对象关系的总结
- Hibernate对象之间的三种关系
- 域对象之间的关系
- java对象之间的关系
- java--------【对象之间的关系】
- 面向对象的几种关系
- 面向对象对象之间的关系
- 对象与对象之间的关系
- 【iOS开发-72】设置状态栏的两种方式、程序生命周期以及更好地理解几大类(对象)之间的关系
- JS对象以及创建对象的几种方式
- OutMan——面向对象的三大特性、对象和对象之间的关系以及动态类型检测方法
- Python 用OPEN读文件报错 ,路径以及r
- python2.7进行爬虫百度POI代码(划分小网格算法)
- sql 安装过程和安装密钥
- SQL中语句:UNION all与UNION 的用法与区别
- 如何解决BIGINT UNSIGNED value is out of range
- 对象导论以及对象之间的几种关系的总结
- 从源码的角度看Activity是如何启动的
- SAX解析XML:学习
- Python 异常处理
- 为CSDN博客添加站内搜索栏目
- 运算符
- python爬取晋江手机界面的链接
- S3C2440 cp15协处理器详解
- 慕课网学习spring入门篇-AOP基本概念