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

类与类之间的关系详解

Java 类与类之间的关系详解

在面向对象编程中,类与类之间的关系主要分为以下6种,每种关系都有其特定的语义和实现方式:


1. 继承(Inheritance)

定义

  • "is-a"关系:子类是父类的一种特殊形式
  • 通过 extends 关键字实现

特点

  • 子类继承父类的属性和方法
  • Java 是单继承(一个类只能继承一个父类)
  • 支持方法重写(Override)

代码示例

class Animal {void eat() { System.out.println("Eating..."); }
}class Dog extends Animal {  // Dog is-a Animalvoid bark() { System.out.println("Barking..."); }
}

UML表示

Animal
Dog

2. 实现(Implementation)

定义

  • 类与接口之间的关系
  • 通过 implements 关键字实现

特点

  • 一个类可以实现多个接口
  • 必须实现接口中所有抽象方法(Java 8+ 允许默认方法)

代码示例

interface Swimmable {void swim();
}class Fish implements Swimmable {  // Fish implements Swimmablepublic void swim() {System.out.println("Fish swimming");}
}

UML表示

Swimmable
Fish

3. 关联(Association)

定义

  • "has-a"关系:一个类知道另一个类的存在(长期关系)
  • 可以是单向或双向

类型

类型描述生命周期依赖
单向关联A→B(A知道B,B不知道A)
双向关联A↔B(互相知道)

代码示例

class Teacher {private List<Student> students;  // Teacher has Students
}class Student {private Teacher teacher;  // Student has a Teacher (双向)
}

UML表示

1
*
Teacher
Student

4. 聚合(Aggregation)

定义

  • 弱"has-a"关系:整体与部分可独立存在
  • 通过成员变量实现,通常通过构造函数或setter注入

特点

  • 部分可以属于多个整体
  • 整体销毁时部分不一定销毁

代码示例

class Department {private List<Professor> professors;  // Department has Professors
}class Professor { /*...*/ }  // Professor可以独立存在

UML表示

Department
Professor

5. 组合(Composition)

定义

  • 强"has-a"关系:部分不能脱离整体存在
  • 整体负责部分的生命周期

特点

  • 部分只能属于一个整体
  • 整体销毁时部分必须销毁

代码示例

class Car {private Engine engine;  // Car has-an Engine (组合)public Car() {this.engine = new Engine();  // Engine随Car创建/销毁}
}class Engine { /*...*/ }

UML表示

Car
Engine

6. 依赖(Dependency)

定义

  • 临时性关系:一个类的变化可能影响另一个类
  • 最弱的关系,表现为:
    • 方法参数
    • 局部变量
    • 静态方法调用

特点

  • 临时性耦合
  • 不需要长期持有对象引用

代码示例

class ReportGenerator {void generate(Data data) {  // 依赖Data类Formatter formatter = new Formatter();  // 依赖Formatter类// ...}
}

UML表示

ReportGenerator
Data
Formatter

关系对比总结

关系类型关键词生命周期UML箭头示例
继承extendsDogAnimal
实现implements虚线FishSwimmable
关联成员变量长期TeacherStudent
聚合成员变量独立◇→DepartmentProfessor
组合成员变量同生共死◆→CarEngine
依赖临时使用短暂虚线ReportData

记忆技巧

“继承实现是垂直,关联聚合组合横,
依赖关系最短暂,箭头方向要分清。”

  1. 垂直关系(类层级):

    • 继承(实线三角)
    • 实现(虚线三角)
  2. 水平关系(对象协作):

    • 关联(普通箭头)
    • 聚合(空心菱形)
    • 组合(实心菱形)
  3. 临时关系

    • 依赖(虚线箭头)

面试常见问题

  1. 聚合和组合有什么区别?

    • 聚合:部分可独立存在(如大学教师
    • 组合:部分必须随整体销毁(如汽车发动机
  2. 为什么优先使用组合而不是继承?

    • 组合更灵活(运行时可改变),避免继承的脆弱性
  3. 依赖和关联如何选择?

    • 需要长期持有用关联,临时使用用依赖
http://www.xdnf.cn/news/254233.html

相关文章:

  • 部署Superset BI(二)再战Superset
  • 【信息系统项目管理师-论文真题】2013上半年论文详解(包括解题思路和写作要点)
  • AI编译器对比:TVM vs MLIR vs Triton在大模型部署中的工程选择
  • PyQt 或 PySide6 进行 GUI 开发文档与教程
  • 【东枫电子】AMD / Xilinx Alveo™ UL3422 加速器
  • MTV-SCA:基于多试向量的正弦余弦算法
  • GNOME扩展:ArcMenu的Brisk布局左右调换
  • 在Kali Linux上安装GNOME桌面环境完整教程
  • 【Linux系统】线程
  • 一种快速计算OTA PSRR的方法(Ⅰ)
  • open files 打开文件数
  • SALOME源码分析: JobManager
  • [更新完毕]2025五一杯B题五一杯数学建模思路代码文章教学: 矿山数据处理问题
  • php artisan resetPass 执行密码重置失败的原因?php artisan resetPass是什么 如何使用?-优雅草卓伊凡
  • PDF转换工具xpdf-tools-4.05
  • 【AI面试准备】AI误判案例知识库优化方案
  • 依赖倒置原则
  • AI外挂RAG:大模型时代的检索增强生成技术
  • 笔试专题(十四)
  • 基于C++、JsonCpp、Muduo库实现的分布式RPC通信框架
  • c语言的常用关键字
  • (六——下)RestAPI 毛子(Http resilience/Refit/游标分页)
  • math.atan2(y, x)
  • 人工智能搜索时代的SEO:关键趋势与优化策略
  • PyTorch 2.0编译模式深度评测:图优化对GPU利用率的影响
  • LabVIEW 中VI Server导出 VI 配置
  • 深入理解 C++ 数据类型:从基础到高级应用
  • JDBC编程实战:从基础连接到高效连接池应用
  • 【五一培训】Day 2
  • 多模态大模型轻量化探索-开源SmolVLM模型架构、数据策略及其衍生物PDF解析模型SmolDocling