Java基础 【类之间的关系】
在Java与其他面向对象设计语言中,类之间常见的关系有6种
分别是: 依赖、关联、聚合、组合、继承、实现,他们的耦合度依次增强。 其中,关联、聚合、组合关系仅仅是在语义上有所区别,所谓语义就是指上下文环境、特定情境环境等,他们在编程语言中的体现却是基本相同的
耦合度 No.1 组合 > No2. 聚合 > No3.关联 > No4.依赖
* 依赖(Dependence),即“uses-a”关系,是一种最明显的、最常见的关系。依赖关系表示一个类依赖于另一个类的定义,一个类的方法操纵另一个类的对象。
一般而言,依赖关系在JAVA中体现为局域变量、方法的形参,或者对静态方法的调用。
例如,一个人(Driver)可以开车(Car),Driver类依赖于Car类的定义,因为Driver类引用了Car。与关联不同的是,Driver类里并没有Car类型的属性,Car的实例是以参量的方式传入到Driver类的方法中去的。
1 class Car {
2 public static void run(){
3 System.out.println("汽车在奔跑");
4 }
5 }
6
7 class Driver {
8 //使用形参方式发生依赖关系
9 public void drive1(Car car){
10 car.run();
11 }
12 //使用局部变量发生依赖关系
13 public void drive2(){
14 Car car = new Car();
15 car.run();
16 }
17 //使用静态变量发生依赖关系
18 public void drive3(){
19 Car.run();
20 }
21 }
关联(Association),是类与类之间的联接。它使一个类知道另一个类的属性和方法。
对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。
关联可以是双向的,也可以是单向的。在JAVA中,关联关系一般使用成员变量来实现。
在JAVA中,单向关联表现为:类A当中使用了类B,其中类B是作为类A的成员变量。
双向关联表现为:类A当中使用了类B作为成员变量;同时类B中也使用了类A作为成员变量。
1 class Student {
2 public static void study(){
3 System.out.println("学生正在学习");
4 }
5 }
6
7 class Class {
8 //使用成员变量形式实现关联
9 Student student;
10 public void drive(){
11 student.study();
12 }
13 }
14
15
* 聚合(Aggregation),即“has-a”关系,是关联关系的一种,是强的关联关系。
聚合是整体和个体之间的关系,意味着类A的对象包含类B的对象。整体和个体是可以分离的,他们具有各自的生命周期,个体可以属于多个对象,也可以被多个对象共享。
关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类是处在不平等层次上的。在JAVA中,聚合关系一般使用成员变量来实现,聚合和关联关系两者的代码表现是相同的,仅仅是在语义上有所区别。
class Student{
Computer pc;
Phone phone;
//聚合关系中作为成员变量的类一般使用set方法赋值
public void setComputer(Computer pc){
This.pc = pc;
}
public void setPhone(Phone phone){
This.phone = phone;
}
public void playcomputergame(){
System.out.println(“正在玩的游戏名字是:”+pc.getGameName());
}
public void playPhone(){
System.out.println(“正在用的手机型号是:”+phone.getPhoneName());
}
}
* 组合(Composition) ,即“contain-a”关系,也是关联关系的一种,是比聚合关系耦合度更强的关系。存在组合关系的类表示“整体-部分”的关联关系,“整体”负责“部分”的生命周期,他们之间是共生共死的;并且“部分”单独存在时没有任何意义。代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。换言之,代表部分的对象在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。部分和整体的生命周期一样。 在JAVA中,组合关系一般使用成员变量来实现,组合关系中的成员变量一般会在构造方法中赋值
例如,People与Soul、Body之间是组合关系,当人的生命周期开始时,必须同时有灵魂和肉体;当人的生命周期结束时,灵魂肉体随之消亡;无论是灵魂还是肉体,都不能单独存在,他们必须作为人的组成部分存在。
1 class People{
2 Soul soul;
3 Body body;
4 //组合关系中的成员变量一般会在构造方法中赋值
5 Public People(Soul soul, Body body){
6 This.soul = soul;
7 This.body = body;
8 }
9
10 Public void study(){
11 System.out.println(“学习要用灵魂”+soul.getName());
12 }
13 Public void eat(){
14 System.out.println(“吃饭用身体:”+body.getName());
15 }
16 }
* 继承(Inheritance),即“is-a”关系,是一种用于表示特殊与一般关系的。表示类与类(或者接口与接口)之间的父子关系。一般而言,如果类A扩展类B,类A不但包含从类B继承的方法,还会拥有一些额外的功能。在JAVA中,用关键字extends表示继承关系
* 实现(Implementation),表示一个类实现一个或多个接口的方法。接口定义好操作的集合,由实现类去完成接口的具体操作。在java中使用implements表示
- Centos6.X 下安装并使用VNC的操作记录
- Linux系统是否被植入木马的排查流程梳理
- 添加php的memcached扩展模块
- Android TextView中显示图片
- Nginx配置中的log_format用法梳理(设置详细的日志格式)
- 分享一个刷网页PV的python小脚本
- mysql完整备份时过滤掉某些库
- Jquery 结合Json控制Select下拉框
- ExtJs学习笔记(23)-ScriptTagProxy+XTemplate+WCF跨域取数据
- Centos7.2下Jumpserver V4.0环境安装部署记录
- 利用JQuery实现更简单的Ajax跨域请求
- 运维工作中sed常规操作命令梳理
- linux下安装php的imagick扩展模块(附php升级脚本)
- 用JS + WCF打造轻量级WebPart
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Mac os上显示与隐藏文件
- windows启动tomcat闪退,乱码问题解决
- Homebrew的安装
- 小程序轮播中嵌入视频-关于swiper、video组件与block标签
- Pocket重建您的专注力
- redux-thunk
- 使用vuepress-6小时搭建一个完全免费的个人网站
- 使用item2+oh my zsh优化终端体验
- Svelte中文文档 1基础介绍
- 分布式事物TCC
- docker环境搭建nexus私有maven私服
- mysql每天定时自动全库备份、灾备、docker
- wails Go+vue/angular/react编写桌面GUI客户端
- GIT仓库、源码管理服务器gitea的安装、htttps访问
- 微信小程序显示当前系统年月日时分秒