Java 对象间关系(依赖、关联、聚合和组合)

简介: 面向对象设计 对象间关系:依赖、关联、聚合和组合,四种关系容易混淆。特别后三种,只是在语义上有所区别,所谓语义就是指上下文环境、特定情景等。 

目录

前言

一、依赖(Dependency)

二、关联(Association)

三、聚合(Aggregation)

四、组合(Compostion)

总结



前言

面向对象设计 对象间关系:依赖、关联、聚合和组合,四种关系容易混淆。特别后三种,只是在语义上有所区别,所谓语义就是指上下文环境、特定情景等。


一、依赖(Dependency)

依赖关系,是类与类之间的联接。依赖关系表示一个类依赖于另一个类的定义。使用关系。一般情况下,依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。

比如说我要借书,那么我就要去图书馆,那么借书方法实现就要依赖于图书馆,即下面的Book依赖于Library

package demo03;
public class main {
    public static void main(String[] args) {
        Book bo = new Book();
        bo.book();
    }
}
//属于依赖者
class Book {
    public void book() {
        Library lib = new Library();
        lib.library();
        System.out.println("从图书馆借走一本书");
    }
}
//属于被依赖者
class Library {
    public void library() {
        System.out.println("这是一个图书馆");
    }
}

image.gif

image.gif

二、关联(Association)

关联关系,是类与类之间的联接,它使一个类知道另一个类的属性和方法。拥有关系。关联可以是双向的,也可以是单向的。在Java语言中,关联关系一般使用成员变量来实现。 依赖和关联的区别在于依赖是使用,关联是拥有

class Computer{ 
    public void develop(){ 
        System.out.println("Develop "); 
    } 
} 
class Person{
  private Computer computer ;
  public Person(Computer computer){
   this.computer = computer ;
  }
  public void work(){
   computer.develop() ;
   System.out.println("work");
  }
}

image.gif

三、聚合(Aggregation)

聚合关系,是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系。例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。与关联关系一样,聚合关系也是通过实例变量实现的。但是关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。

举例:班级和学生,当班级删除之后,学生还是存在,学生还可能被培训机构引用

// 汽车
class Car{
    // 汽车可以有发动机, 但是不确定什么时候赋予
    private Enginemy engine;
}
// 发动机
class Engine{
}

image.gif

四、组合(Compostion)

组合关系,是关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分对象的生命周期,组合关系是不能共享的。代表整体的对象需要负责保持部分对象和存活,在一些情况下将负责代表部分的对象湮灭掉。代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。换言之,代表部分的对象在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。部分和整体的生命周期一样。

举例:一个人由头、四肢、等各种器官组成,因为人与这些器官具有相同的生命周期,人死了,这些器官也挂了;房子和房间的关系,当房子没有了,房间同样不可能单独存在。

class Room{ 
    public Room createRoom(){ 
        System.out.println("创建房间"); 
        return new Room() ; 
    } 
} 
class House{
  private Room room ;
  public House(){
   room = new Room() ;
  }
  public void createHouse(){
   room.createRoom() ;
  }
 }

image.gif


总结

聚合和组合的区别:聚合是个体离开了整体,依然可以存在.

                                      组合是个体和整体不可以分开,个体不能离开整体单独存在.

依赖,关联 和聚合,组合的区别:依赖,关联 : 类之间的关系是在同一层次上.

                                                              聚合,组合: 类之间的关系表现为整体和部分.

目录
相关文章
|
1月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
50 17
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
33 6
|
2月前
|
Oracle Java 关系型数据库
重新定义 Java 对象相等性
本文探讨了Java中的对象相等性问题,包括自反性、对称性、传递性和一致性等原则,并通过LaptopCharger类的例子展示了引用相等与内容相等的区别。文章还介绍了如何通过重写`equals`方法和使用`Comparator`接口来实现更复杂的相等度量,以满足特定的业务需求。
29 3
|
2月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
2月前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第3天】Java零基础教学篇,手把手实践教学!
32 1
|
2月前
|
Java 数据安全/隐私保护
java类和对象
java类和对象
26 5
|
1月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
44 0
|
2月前
|
存储 前端开发 Java
你还没有对象吗?java带你创建一个吧
你还没有对象吗?java带你创建一个吧
18 0
下一篇
DataWorks