对象之间的关系

2023-11-11

Java的对象/类之间有四种关系:依赖、关联、组合、聚合、继承、实现。

1. 依赖

依赖(Dependency): 一个对象的功能依赖于另一个对象。

  • 类比:人类生存依赖食物和空气

  • 体现:被依赖者体现为依赖者的局部变量参数静态方法的调用

  • 示例:

    UML:

    code:

    public class Human {
        public void live(Food food) {
            Air.breath();
            food.eat();
        }
    }
    
    class Air {
        public static void breath() {
            System.out.println("呼吸...");
        }
    }
    
    class Food {
        public void eat() {
            System.out.println("进食...");
        }
    }
    

2. 关联

关联(Association): 一个类需要知道另一个类的情况(属性、方法),可以是双向,也可以是单向。

  • 类比:人类进食需要知道食物有没有过期

  • 体现:关联的对象一般是作为成员变量

  • 示例:

    UML:

    code:

    public class Human {
    
        private Food food;
        public void judge() throws ParseException {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
            if (format.parse(food.getExpiration()).compareTo(new Date()) > 0 ) {
                food.eat();
            } else {
                System.out.println("食物已经过期");
            }
        }
    
        public Human(Food food) {
            this.food = food;
        }
    }
    
    class Food {
    
        private String expiration;
    
        public void eat() {
            System.out.println("食物安全,可以食用");
        }
    
        public Food() {
            this.expiration = "2023-04";
        }
    
        public String getExpiration() {
            return expiration;
        }
    }
    

3. 聚合

聚合(Aggregation): 一种强关联关系(has-a),关联(Association)的对象是同一层级的,而聚合(aggregation)则是整体与组成个体之间的关系。不同整体之间可以共享个体,比如说氢分子也由氢原子组成。

  • 类比:水分子由氢原子和氧原子组成

  • 体现:被聚合对象作为成员变量

  • 实例:

    UML:

    code:

    public class WaterMolecule {
    
        private HydrogenAtom2 hydrogenAtom2;
        private OxygenAtom atom;
    
        public WaterMolecule(HydrogenAtom2 hydrogenAtom2, OxygenAtom atom) {
            this.hydrogenAtom2 = hydrogenAtom2;
            this.atom = atom;
        }
    }
    
    class OxygenAtom {
    
    }
    
    class HydrogenAtom2 {
    
    }
    

4. 组合

组合(Compostion): 比聚合更强的关联关系(is-a),组合关系要求聚合关系中代表整体的对象要负责代表个体/部分的对象的整个生命周期,所以组合关系不能共享。如果代表整体的对象被销毁或破坏,那么代表个体的对象也一定会被销毁或破坏。

  • 类比:人和人的心脏、大脑

  • 体现:个体对象作为成员变量

  • 实例:

    UML:

    code:

    public class Human {
        private Brain brain;
        private Heart heart;
        private String status;
    
        public void sustainLife() {
            brain.control(status);
            heart.beat(status);
        }
    
        public Human(Brain brain, Heart heart, String status) {
            this.brain = brain;
            this.heart = heart;
            this.status = status;
        }
    }
    
    class Brain {
        public void control(String status) {
            if (status.equals("0")) {
                System.out.println("脑死亡");
            } else {
                System.out.println("大脑控制身体");
            }
        }
    }
    
    class Heart {
        public void beat(String status) {
            if (status.equals("0")) {
                System.out.println("心跳停止");
            } else {
                System.out.println("心脏跳动");
            }
        }
    }
    

5. 继承

继承(extends): 对象之间耦合度最大的一种关系,是父与子的关系。

  • 类比:父亲和儿子
  • 体现:子类(派生类)和父类(基类、超类)
  • 实例:

    UML:

    code:
    public class Tom {
    	public void farm() {
    		System.out.println("种地");
    	}
    }
    
    class Jack extends Tom {
    	@Override
    	public void farm() {
    		System.out.println("种地");
    	}
    
    	public void makeWine() {
    		System.out.println("酿酒");
    	}
    }
    

6. 实现

实现(implements): 接口与实现类之间的关系,实现类需要实现接口中所声明的所有方法。

  • 实例:

    UML:

    code:

    public interface Animal {
        void live();
    }
    
    class Cat implements Animal {
        @Override
        public void live() {
            System.out.println("生存");
        }
    } 
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对象之间的关系 的相关文章

  • 如何克服原语按值传递的事实

    我有一段很长的代码来计算两个值 doubles 对我来说 我在几个地方使用了这段代码 为了坚持 DRY 原则 我应该将这段代码重构为一个很好的单元测试方法 但是我不能让它返回两个双精度数 而双精度数是原始的 因此不能按值传递和操作 我能想到
  • Java - 为什么不允许 Enum 作为注释成员?

    It says 原始 String Class an Enum 另一个注释 上述任何一个的数组 只有这些类型才是合法的 Annotation 成员 为什么泛型 Enum 不能成为 Annotation 的成员 例如 Retention Re
  • Hibernate注解放置问题

    我有一个我认为很简单的问题 我见过两种方式的例子 问题是 为什么我不能将注释放在字段上 让我举一个例子 Entity Table name widget public class Widget private Integer id Id G
  • 如何创建一个显示 Spinners 的 x 和 y 值的表格?

    我想创建一个位于图表右侧的表格 其中显示 2 列 x 和 y 值已输入到xSpin and ySpin旋转器 我已经画了一张我想要桌子放置的位置的图 我尝试过在网格窗格布局中使用文本框来创建表格并将值直接输入到文本框网格中 但是我无法将它们
  • 使用 JPA Criteria API 进行分页的总行数

    我正在系统中为实体实现 高级搜索 功能 以便用户可以使用该实体的属性上的多个条件 eq ne gt lt 等 来搜索该实体 我正在使用 JPA 的 Criteria API 动态生成 Criteria 查询 然后使用setFirstResu
  • JavaFX 中具有自定义内容的 ListView

    How i can make custom ListView with JavaFx for my app I need HBox with image and 2 Labels for each line listView 您可以通过查看
  • 按第一列排序二维数组,然后按第二列排序

    int arrs 1 100 11 22 1 11 2 12 Arrays sort arrs a b gt a 0 b 0 上面的数组已排序为 1 100 1 11 2 12 11 22 我希望它们按以下方式排序a 0 b 0 首先 如果
  • 使用 AES SecretKey 的 Java KeyStore setEntry()

    我目前正在 Java 中开发一个密钥处理类 特别是使用 KeyStore 我正在尝试使用 AES 实例生成 SecretKey 然后使用 setEntry 方法将其放入 KeyStore 中 我已经包含了代码的相关部分 The KS Obj
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • 如何模拟从抽象类继承的受保护子类方法?

    如何使用 Mockito 或 PowerMock 模拟由子类实现但从抽象超类继承的受保护方法 换句话说 我想在模拟 doSomethingElse 的同时测试 doSomething 方法 抽象超类 public abstract clas
  • 匿名类上的 NotSerializedException

    我有一个用于过滤项目的界面 public interface KeyValFilter extends Serializable public static final long serialVersionUID 7069537470113
  • Java 中的“Lambdifying”scala 函数

    使用Java和Apache Spark 已用Scala重写 面对旧的API方法 org apache spark rdd JdbcRDD构造函数 其参数为 AbstractFunction1 abstract class AbstractF
  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s
  • 如何在selenium服务器上提供自定义功能?

    我知道可以通过某种方法获得一些硒功能 其中之一如下 driver getCapabilities getBrowserName 它返回浏览器名称的值 但如果它指的是一个可用的方法 如果我没有误解的话 这似乎与自定义功能有关 就像我的意思是
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 调整添加的绘制组件的大小和奇怪的摆动行为

    这个问题困扰了我好几天 我正在制作一个特殊的绘画程序 我制作了一个 JPanel 并添加了使用 Paint 方法绘制的自定义 jComponent 问题是 每当我调整窗口大小时 所有添加的组件都会 消失 或者只是不绘制 因此我最终会得到一个
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话

随机推荐

  • 浅析Redux 的 store enhancer

    相信大家都知道Redux的middleware 中间件 的概念 Redux通过middleware可以完成发送异步action 网络请求 打印action的日志等功能 相对而言 Redux的store enhancer的概念 很多人并不是很
  • 【MLOps】第 5 章 : 生产准备

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 副本与ISR设计--Kafka从入门到精通(十四)

    上篇文章说了 broker的消息设计 采用紧凑的byteBuffer 存储设计主要包含attribute后三个表示压缩类型 还有crc效验 以及key和value 后面新增了时间戳 Broker消息设计 Kafka从入门到精通 十三 htt
  • js实现数学的排列组合

    js实现数学的排列组合 实现 组合 param arr 待选数组 param size 从数组里面要抽几个元素进行组合 function combination arr size 1 45 3 9 4 14 1 const r param
  • 如何二次封装Element-Plus table组件

    最近做了一个后台的项目 需要用到大量的表格组件 我就试着把它给封装了一下 记录一下 那么现在开始了 父页面代码
  • Linux_centos7_网络管理1_2

    测试网络连接状态 kingarthur localhost ping www google com PING www google com 174 37 175 229 56 84 bytes of data C www google co
  • nginx_upstream_check_module模块

    nginx upstream check module模块 一个更专业的模块 来专门提供负载均衡器内节点的健康检查的 这个就是淘宝技术团队开发的 nginx 模块nginx upstream check module 通过它可以用来检测后端
  • 静态链接和动态链接的区别

    在理解静态和动态 共享 库链接之间的区别之前 让我们先看一个典型程序的生命周期 从编写源代码到执行它 首先使用任何程序员选择的编辑器以文本文件的形式编写程序 然后必须对其进行编译以将文本文件转换为机器可以理解和执行的目标代码 通常我们编写的
  • 1216项目设计模板

    一 基本信息 目标上线时间 yyyy mm dd 项目人员 研发 测试 背景 二 功能需求 1 业务平台 1 业务的订购 配置默认的模板或者策略 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img I8vhSe47
  • 最全的Pandas 日期处理 超强总结!

    对于 Pandas 来说 可以处理众多的数据类型 其中最有趣和最重要的数据类型之一就是时间序列数据 时间序列数据无处不在 它在各个行业都有很多应用 患者健康指标 股票价格变化 天气记录 经济指标 服务器 网络 传感器和应用程序性能监控都是时
  • leetcode-135-分发糖果

    老师想给孩子们分发糖果 有 N 个孩子站成了一条直线 老师会根据每个孩子的表现 预先给他们评分 你需要按照以下要求 帮助老师给这些孩子分发糖果 每个孩子至少分配到 1 个糖果 相邻的孩子中 评分高的孩子必须获得更多的糖果 那么这样下来 老师
  • SpringBoot 集成sharding-jdbc 提示:Failed to configure a DataSource: ‘url‘ attribute is not specified ***

    问题描述 今天使用SpringBoot 集成sharding jdbc 4 1 1实现分库分表时报错 APPLICATION FAILED TO START Description Failed to configure a DataSou
  • 记录一次因now()函数应用周期性查不到数据的问题

    问题原因 查询sql使用了now 函数 测试环境数据库所在的容器日期不对 与实际时间晚8个小时 问题背景描述 某天下午快要下班的时候 大概五点的样子 某个测试小哥在系统里点击用户注册功能注册后 一切数据都正常生成后 登录新注册的用户 发现这
  • 基础算法题——Radio Transmission(KMP-next 妙用)

    Radio Transmission 解题思路 在KMP算法中 next l 记录的就是字符串最长的相同的前缀与后缀 也就是说在题目字符串中有一段字符串是重复出现的 那么减去重复出现的字符串以后 剩下的就是这个字符串最小的循环节 比较字符串
  • 19.RV1126_RV1109编写并移植nvp6021驱动

    文章目录 前言 确定硬件 配置设备树生成节点 前言 nvp6021是一个i2C器件 因此 应该编写I2C设备驱动 既然是I2C设备驱动 应该确定的有 使用的是哪一路I2C I2C设备地址是多少等 确定硬件 使用的是哪一路I2C 从上面可以看
  • 动态规划算法与典型例题

    目录 前言 一 动态规划要素 条件 二 动态规划算法设计步骤 三 复杂度分析 四 典型例题1 游艇租聘 五 典型例题2 0 1背包问题 六 典型例题3 跳台阶问题 七 典型例题4 强盗抢劫问题 总结 前言 动态规划也是一种分治思想 分治算法
  • html 在html文件中循环遍历数组并展示

    用html文件实现一个简单的遍历数组并输出到页面上面
  • unixbench测试CPU性能工具/mbw测试内存

    一 unixbench工具 UnixBench是一个类unix系 Unix BSD Linux 统下的性能测试工具 一个开源工具 被广泛用与测试linux系统主机的性能 Unixbench的主要测试项目有 系统调用 读写 进程 图形化测试
  • 【碎碎念随笔】1、回顾我的电脑和编程经历

    闲着无事 讲述一下我的计算机和代码故事 一 初识计算机 余家贫 耕植无钱买电脑 大约六年级暑假 我在姐姐哪儿第一次接触到了计算机 姐姐也是买的二手 计算机真有趣 在我眼中 计算机上寒假了世界上的好东西 是个聚宝盆 在计算机上 可以打小游戏
  • 对象之间的关系

    目录 1 依赖 2 关联 3 聚合 4 组合 5 继承 6 实现 Java的对象 类之间有四种关系 依赖 关联 组合 聚合 继承 实现 1 依赖 依赖 Dependency 一个对象的功能依赖于另一个对象 类比 人类生存依赖食物和空气 体现