类和类之间存在多种关系,而这种关系在我们的代码中司空见惯,有时多种类关系很难区分

(由于水平有限,没有画出类的关系图,关系图可以参考参考链接)

  • 继承关系

    继承是指一个子类(子接口)继承父类(父接口)然后拓展子类的功能

  • 实现关系

    实现是指一个类实现接口(或多个接口)在java中很常见

  • 依赖关系

,依赖就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是类B的变化会影响到类A。

表现在代码层面,为类B作为参数被类A在某个method方法中使用。(函数的引用传递)

  • 关联关系

    关联体现的是两个类之间语义级别的一种强依赖关系,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。关联可以是单向、双向的。表现在代码层面,为被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量,如有一个人有一本书,一本书属于一个人,在人这个类中如果没有书这个属性,并不影响人这个类的完整性,同样书这个类中没有人这个属性也不影响书的完整性,他们之间仅仅是一种关联的关系

关联关系举例

//描述类中的关联关系
//以书和人为例子 表现相关关联
class Book{
private String name;//书名
private String author;//作者
private Person person;//该书的拥有者 //构造方法为该书的属性赋值
public Book(String name,String author){
setName(name);
setAuthor(author);
}
public String getName(){
return this.name;
}
public String getAuthor(){
return this.author;
}
//获得该书的拥有者
public Person getPerson(){
return person;
}
public void setName(String name){
this.name=name;
}
public void setAuthor(String author){
this.author=author;
}
//设置该书的拥有者
public void setPerson(Person person){
this.person=person;
} } //定义Person类
class Person{
private String name;//姓名
private int age;//年龄
private Book book;//该人所拥有的书
public Person(){};
//构造方法为人的属性赋值
public Person(int age,String name){
setAge(age);
setName(name);
}
public int getAge(){
return this.age;
}
public String getName(){
return this.name;
}
public Book getBook(){
return book;
}
public void setAge(int age){
this.age=age;
}
public void setName(String name){
this.name=name;
}
public void setBook(Book book){
this.book=book;
} } //测试类
public class AssociationTest{
public static void main(String[]args){
//分别实例化人和书
Book book1=new Book("java编程思想","seefeccve");
Person per1=new Person(23,"刘涛"); //设置书和人双向对应的关系
per1.setBook(book1);//设置该人的书
book1.setPerson(per1);//设置该书属于什么人
System.out.println("通过人找到书: 姓名:"+per1.getName()+"年龄:"+per1.getAge()+"书名"+per1.getBook().getName()+"作者"+per1.getBook().getAuthor());
System.out.println("通过书找到人: 书名:"+book1.getName()+"作者:"+book1.getAuthor()+"拥有者:"+book1.getPerson().getName()+"年龄:"+book1.getPerson().getAge()); } }



虽然说构造方法的作用是设置类中的属性,但在该处比较特殊,Book类中的person ,Person 类中的book的设置并没有用构造方法而是单独设置

  • 解释1

    构造方法的是将类的属性进行设置,但该处的book和person虽然属于该类但与该类仅仅是关联关系,意思是如果没有该属性,该类依然完整,如果一个人没有书,难道就不是一个人了吗,一本书如果没有一个拥有者难道就不是一本是了吗,如果用构造方法设置才显得突兀了

  • 解释2

    我们还需要设置这两个类的关系,如果将book和person都放在构造方法中初始化就无法表示这种关系了,想想一下,初始化Book 需要传入一个person对象,而得到person对象又要Book对象,但Book对象还没有实现呢,反过来也是一样,这样2者都无法实现

  • 聚合关系

聚合是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系。此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。思考一下继承的关系是不是可以用has-a的关系来表示

举例说明

一个人有一个孩子,每个孩子有一本书

//描述聚合关系
//一本书属于一个人 一个人有一本书(关联关系)
//一个孩子 有一本书 一个人有一个孩子 class Book{
private String name;//书名
private String author;//作者
private Person person;//该书的拥有者 //构造方法为该书的属性赋值
public Book(String name,String author){
setName(name);
setAuthor(author);
}
public String getName(){
return this.name;
}
public String getAuthor(){
return this.author;
}
//获得该书的拥有者
public Person getPerson(){
return person;
}
public void setName(String name){
this.name=name;
}
public void setAuthor(String author){
this.author=author;
}
//设置该书的拥有者
public void setPerson(Person person){
this.person=person;
} } class Person{
private String name;//姓名
private int age;//年龄
private Book book;//该人有一本书
private Person child;//该人有一个孩子
public Person(){};
public Person(String name,int age){
setName(name);
setAge(age);
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
public Book getBook(){
return book;
}
public Person getChild(){//注意该处返回类型
return child;
}
public void setName(String name){
this.name=name;
}
public void setAge(int age){
this.age=age;
}
public void setBook(Book book){
this.book=book;
}
public void setChild(Person child){//注意该处的参数类型
this.child=child;
} } //测试类
public class Aggregation{
public static void main(String[]args){
Book book1=new Book("java开发","张三");
Person per1=new Person("大刘",34);
Person child1=new Person ("小刘",2);
//关系设置
book1.setPerson(per1);//该书属于一个人
per1.setBook(book1);//该人拥有一本书
child1.setBook(book1);//没有孩子拥有一本书
per1.setChild(child1);//一个人拥有一个孩子 //验证关联关系
System.out.println("通过人找到书: 姓名:"+per1.getName()+"年龄:"+per1.getAge()+"书名"+per1.getBook().getName()+"作者"+per1.getBook().getAuthor());
System.out.println("通过书找到人: 书名:"+book1.getName()+"作者:"+book1.getAuthor()+"拥有者:"+book1.getPerson().getName()+"年龄:"+book1.getPerson().getAge());
//验证聚合关系
System.out.println("通过人找到孩子:姓名:"+per1.getName()+"年龄:"+per1.getAge()+per1.getChild().getName()+"年龄:"+per1.getChild().getAge()); //后面通过孩子找到书,其实是和关联关系联合才能实现的 后面不实现
、 }
}

这里孩子的类其实是不用实现的,可以借用Person类进行表示

  • 组合关系

    组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,比如人和人的大脑。表现在代码层面,和关联关系是一致的,只能从语义级别来区分,这种关系是最强的

后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖。

参考:

总结的很好很棒

https://pdai.tech/md/java/basic/java-basic-oop.html#%E6%B3%9B%E5%8C%96%E5%85%B3%E7%B3%BB-generalization

java中类的关系的总结的更多相关文章

  1. Java中类的关系

    在java里类的关系大致分为三种, 1.继承(a is b):继承extends,实现implement 2.包含(a has b):组合>聚合>关联.关系亲密度越来越小,一个类在另一个类 ...

  2. Java 中类与类之间的关系

    在java中类和类之间的关系基本上有依赖.关联.聚合.组合等 一.继承关系     继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在J ...

  3. Java中类与类的关系

    在java中类和类的关系大致分三种:泛化.关联.依赖. 1. 泛化(Generalization) "XX是一个XX"关系(is a),通常使用的关键词为 extends.impl ...

  4. java中类的创建及初始化过程

    java中类的创建及初始化过程无外乎两种情况,其一为单类的创建及初始化,其二具有继承关系的父子类创建及初始化过程.     首先说简单的,单类的创建及初始化过程.在java中我们都知道绝大部分对象的创 ...

  5. java 中类的加载顺序(转)

    1.虚拟机在首次加载Java类时,会对静态初始化块.静态成员变量.静态方法进行一次初始化 2.只有在调用new方法时才会创建类的实例 3.类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始 ...

  6. Java中类的继承,属性和方法的四种修饰符的作用范围,final关键字,java的三大特点中的2个:封装和多态,以及多态的一个设计模式,模板方法模式(template method)

    (一)Java中的继承: 关于继承,在Java中类的继承只能是单继承,不像C+++那样灵活,可以多继承,多继承的后果就是各种关系乱套,就相当于一个孩子有2个母亲一样,社会关系的复杂,不利于程序后期的开 ...

  7. 面向对象的编程思想和Java中类的概念与设计

    面向对象的编程思想学习,面向对象内容的三条主线;1.java类及类的对象2.面向对象的三大特征3.其他关键字学习内容:3.1面向对象与面向过程面向对象与面向过程在应用上的区别 Java中类的概念与设计 ...

  8. Java中类的继承深入剖析

    在Java开发中,我们常常用到继承这一概念,可以说继承是Java这类面向对象编程语言的基石.正是有了继承这个概念,使得我们可以创建分等级层次的类.今天小编就和大家一起来深入聊聊Java语言的继承. 在 ...

  9. Java中类,对象,方法的内存分配

    Java中类,对象,方法的内存分配 以下针对引用数据类型: 在内存中,类是静态的概念,它存在于内存中的CodeSegment中. 当我们使用new关键字生成对象时,JVM根据类的代码,去堆内存中开辟一 ...

随机推荐

  1. HCIA-Datacom 4.1 实验一:访问控制列表配置实验

    实验介绍 访问控制列表ACL(Access Control List)是由一条或多条规则组成的集合.所谓规则,是指描述报文匹配条件的判断语句,这些条件可以是报文的源地址.目的地址.端口号等.ACL本质 ...

  2. [NOIP2018提高组] 保卫王国 (树链剖分+动态DP)

    题面 题目链接-Luogu 题目链接-Loj(要加Freopen) 题解 什么是动态DP? OneInDark:你不需要知道这么多,你只需要知道是利用了广义矩阵乘法就够了! 广义矩乘 广义矩阵乘法,简 ...

  3. C#基础_XML文件介绍

    XML简介 XML 被设计用来传输和存储数据. HTML 被设计用来显示数据. 什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语 ...

  4. C# for循环创建多线程

    这里仅讨论Task多线程编程,不讨论其他可以使用多线程的情况,比如Beginxxx,Thread等 一般情况下,如果有多个线程需要同是启动,且每个线程中使用了集合collection中的序号. 比如参 ...

  5. 第四篇:理解vue代码

    解释以下代码: 实现输入框中能够打字的功能 <el-input v-model="input" placeholder="在这打字"></el ...

  6. KingbaseES 自增列三种方式

    KingbaseES中3种自增长类型sequence,serial,identity的区别: 对象 显示插入 显示插入后更新最大值 清空表后是否重置 是否跟事务一起回滚 多对象共享 支持重置 出现错误 ...

  7. KingbaseES R3 集群pcp_attach_node 更新show pool_nodes中节点状态

    系统环境: 操作系统: [kingbase@node2 bin]$ cat /etc/centos-release CentOS Linux release 7.2.1511 (Core) 数据库: ...

  8. Dapr 证书过期了怎么办? 别慌,有救!

    一.背景 Dapr 默认证书有效时间是1年,证书过期后就不能执行相关控制面和数据面的交互了,如下图: 二.查看证书有效时间 通过dapr mtls expiry 看到期时间,具体参见命令https:/ ...

  9. flask-bootstrap 模版中所需的CSS/JS文件实现本地引入

    Flask-Bootstrap默认是加载CDN的css与js文件,每次刷新页面都要访问到外网的cdn来获取css与js文件; 模版扩展来自于bootstrap/base.html,就以bootstra ...

  10. C语言指针笔记01

    int num = 90; 定义一个整型变量num int* ptr = &num; 定义一个整型指针变量ptr,指针变量ptr的类型取决于他所需要指向的变量,如这里,ptr要指向int类型变 ...