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

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

  • 继承关系

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

  • 实现关系

    实现是指一个类实现接口(或多个接口)在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. Atcoder Beginner Contest 200 E. Minflip Summation(概率数论)

    题面 一个字符串 T T T 是由一个包含 0.1.? 的字符串 S S S 循环连接 K K K 次获得的. 字符串 T T T 中的每个 ? 都可以换成 0 或 1 ,假设 T T T 中一共有 ...

  2. Linux安装Jenkins及配置svn使用

    目录 1. 下载 2. 创建文件夹 3. 安装 4. 修改端口,不用这步 5. 安装插件提速 6. 启动 7. 页面访问 8. 新建用户 9. 安装Subversion插件 10. 安装maven插件 ...

  3. AtCoder Beginner Contest 260 (D-E)

    AtCoder Beginner Contest 260 - AtCoder D - Draw Your Cards 题意:N张卡牌数字 1-n,以某种顺序排放,每次拿一张,如果这一张比前面某一张小( ...

  4. 【Android 逆向】手动构造dex文件

    public class Hello { public static void main(String[] args) { System.out.println("hello android ...

  5. WindowsApps目录占用大量空间

    WindowsApps目录占用大量空间今天遇到一个客户端的问题.Windows 10的电脑100G的C盘空间几乎耗尽.但是选取所有文件后总大小只有不到40G.按常规,肯定是有一些没有权限的文件夹的体积 ...

  6. 2021年3月-第01阶段-Linux基础-Linux系统概念-Linux命令

    Linux系统基本概念 图形界面: Ctrl+Shift +号 //调整命令终端变大 Ctrl - 号 //调整命令终端变小 命令终端: ~ 家目录:用户的私有场所,其他用户不能随便访问 root超级 ...

  7. 微服务低代码Serverless平台(星链)的应用实践

    导读 星链是京东科技消金基础研发部研发的一款研发效能提升的工具平台,面向后端服务研发需求,尤其是集成性.场景化.定制化等难度不太高.但比较繁琐的需求,如服务前端的后端(BFF).服务流程编排.异步消息 ...

  8. 关于使用kuboard安装其自带的监控应用授权普通用户使用

    官方文档地址:https://www.kuboard.cn/guide/example/monitor-v2.html#授权用户访问套件

  9. kibana启动停止命令

    前提条件:kibana文件是属于kibana用户的 注意:路径根据具体实际情况修改 更改日志所属用户和用户组 chown kibana:kibana /usr/local/kibana-7.5.1-l ...

  10. SkyWalking 6.x 的架构图

    可以看到主要由四部分组成: Agent(也叫Probe):代理或者探针,集成在被监测的应用中(SDK形式或者动态注入),采集应用的数据发送给后端(OAP). UI:自带的Web页面. OAP:后端,接 ...