当前位置: 首页 > news >正文

类与类之间的几种关系

一、继承关系      继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。在Java中继承关系通过关键字extends明确标识,在设计时一般没有争议性。在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口。 


二、实现关系      实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系。在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性。在UML类图设计中,实现用一条带空心三角箭头的虚线表示,从类指向实现的接口。 


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


四、关联关系  关联体现的是两个类之间语义级别的一种强依赖关系,比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。关联可以是单向、双向的。表现在代码层面,为被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。在UML类图设计中,关联关系用由关联类A指向被关联类B的带箭头实线表示,在关联的两端可以标注关联双方的角色和多重性标记。 


五、聚合关系      聚合是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系。此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。比如计算机与CPU、公司与员工的关系等,比如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。在UML类图设计中,聚合关系以空心菱形加实线箭头表示。 


六、组合关系     组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,比如人和人的大脑。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。在UML类图设计中,组合关系以实心菱形加实线箭头表示。 


七、总结     对于继承、实现这两种关系没多少疑问,它们体现的是一种类和类、或者类与接口间的纵向关系。其他的四种关系体现的是类和类、或者类与接口间的引用、横向关系,是比较难区分的,有很多事物间的关系要想准确定位是很难的。前面也提到,这四种关系都是语义级别的,所以从代码层面并不能完全区分各种关系,但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖。

来自:http://www.cnblogs.com/liuling/archive/2013/05/03/classrelation.html

转载于:https://www.cnblogs.com/SceneryHao/p/5393662.html

相关文章:

  • Redis实战和核心原理详解(8)使用快照RDB和AOF将Redis数据持久化到硬盘中
  • 复利(结对2.0)
  • 为什么要重写hashCode()方法和equals()方法以及如何进行重写
  • 程序员下一门要学的编程语言Swift
  • Jenkins部署Maven多环境项目(dev、beta、prod)的参数设置
  • MATLAB地图工具箱学习总结(一)从地图投影说起
  • MySQL存储引擎MyISAM与InnoDB区别总结整理
  • Atitit。数据库 安全性 重要敏感数据加密存储解决方案
  • MySQL半同步复制原理配置与介绍
  • GIT 远程仓库:添加远程库、从远程库克隆
  • 用优雅的方式重装Windows 10不可使用的应用程序
  • 使用Generic Webhook Trigger插件实现Jenkins+WebHooks(码云)持续集成
  • Redis实战和核心原理详解(4)Redis存储Key的一种设计实现方式:模式匹配
  • 第一次冲刺阶段(六)
  • MyBatis关联映射:一对一、一对多
  • 【comparator, comparable】小总结
  • express.js的介绍及使用
  • go语言学习初探(一)
  • Laravel5.4 Queues队列学习
  • Laravel核心解读--Facades
  • mockjs让前端开发独立于后端
  • Mysql5.6主从复制
  • PHP那些事儿
  • Python进阶细节
  • Redis中的lru算法实现
  • Spring核心 Bean的高级装配
  • Spring声明式事务管理之一:五大属性分析
  • Zepto.js源码学习之二
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 通过git安装npm私有模块
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 自制字幕遮挡器
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • k8s使用glusterfs实现动态持久化存储
  • raise 与 raise ... from 的区别
  • 昨天1024程序员节,我故意写了个死循环~
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #AngularJS#$sce.trustAsResourceUrl
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • $.ajax中的eval及dataType
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Core跨平台微服务学习资源
  • .NET 反射的使用
  • ::
  • @hook扩展分析
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)