Java|学习|类之间的关系,内部类,设计模式

1.类之间的一些关系

依赖关系:一个类的局部变量是另一个类的对象的引用。

关联关系:一个类的成员变量或静态变量是另一个类的对象的引用。

聚合关系:聚合是关联关系的一种,体现整体与部分的关系,即关系。整体和部分是可以分离的,有着各自的生命周期。代码层面和关联关系一致。比如一个类要调用另一个类的对象,另一个类的对象在该类之外创建,那么它们有关联关系但是有各自的生命周期,另一个类的对象不会因为该类的对象销毁而销毁。

组合关系:组合是关联关系的一种,体现整体与部分的关系,但是这个整体和部分是不可以分开的,整体的生命周期结束也就意味着部分的生命周期结束。代码层面和关联关系一致。在类中创建另一个类的对象,那么当这个类的对象销毁时,另一个类的对象也会销毁,这就是组合关系。

2.内部类

2.1 概述

在 Java 中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。

2.2 使用

当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部包含他的事物提供服务,那么整个内部的完整结构最好使用内部类。

在外部类之外引用内部类的话,需要提供内部类完整的名称: 外部类类名$内部类类名

内部类是可以使用权限控制修饰符的。

内部类可以访问外部类中的私有化属性。

2.3 成员内部类

成员内部类,等同于成员变量,没有 static 修饰。

成员内部类中不能有静态声明。这是因为成员内部类等同于外部类的成员变量,在对象的层面上运行,也就是实例化对象以后才会执行成员内部类,而写了静态声明后,静态属性需要在类加载的时候就执行,发生冲突。

成员内部类中可以直接访问外部类的所有数据。

2.4 静态内部类

静态内部类,可以等同看作静态变量。

静态内部类中,可以声明任何数据。这是因为静态内部类等同于静态变量,在类的层面上运行,也就是类加载的时候就会执行,因此不论声明任何数据都可以执行。声明静态属性的话也不会冲突。

静态内部类中无法直接访问外部类的成员属性,需要创建对象才可以访问。因为外部类的成员属性在外部类实例化的时候才会执行,但是静态内部类在外部类加载的时候就执行了,此时无法找到外部类的成员属性。所以需要创建外部类的对象,才可以访问到外部类的成员属性。

2.5 局部内部类

局部内部类,可以看作局部变量。

成员方法中的局部内部类,可以直接访问外部类的成员属性。

静态方法中的局部内部类,不能直接访问外部类的成员属性。

局部内部类,不可以有静态声明。

如果通过局部内部类访问外部方法中的局部变量,该变量需要加 final 修饰。从 JDK1.8 开始, final 可以省略不写,但是该变量还是默认被 final 修饰。

局部内部类前,不可以使用权限修饰符,也不可以使用 static 。

局部内部类的类名为 外部类类名$1内部类类名 。如果内部类类名重复了,类名为 外部类类名$2内部类类名 ,以此类推。

由于局部内部类在某个方法中,所以该内部类只能在这个方法中使用。

2.6 匿名内部类

当一个方法的参数需要传入一个类对象时,均可以使用匿名内部类。一般情况下,是需要传入接口的实现类对象。

此匿名内部类,就等于该类(接口)的子类,不需要定义 class 。

匿名内部类的类名: 外部类类名$1 ,如果有多个匿名内部类, 类名后缀的数字依次递增。

创建匿名内部类传入,此时该类不能复用。

匿名内部类,就相当于创建了一个类(接口)的子类,并创建这个子类的对象传入。

匿名内部类中是不能定义构造函数的。匿名内部类没有类名,而构造方法名需要和类名相同。

匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。

匿名内部类中不能存在任何的静态成员变量和静态方法。

匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

3.设计模式

设计模式是代码设计经验的总结,一般代表了最佳实践。

如果对您有帮助,请点赞关注支持我,谢谢!❤

如有错误或者不足之处,敬请指正!❤

相关推荐
小王努力学编程3 分钟前
动态规划学习——背包问题
开发语言·c++·学习·算法·动态规划
冬天vs不冷1 小时前
EasyExcel导出自动回显中文,读取自动转换码值(基于全局转换器与自定义注解)
java·excel
阿里云云原生1 小时前
RAG 调优指南:Spring AI Alibaba 模块化 RAG 原理与使用
java·人工智能·spring
天上掉下来个程小白1 小时前
Redis-12.在Java中操作Redis-Spring Data Redis使用方式-操作字符串类型的数据
java·redis·spring·springboot·苍穹外卖
ん贤2 小时前
2023第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(真题&题解)(C++/Java题解)
java·c语言·数据结构·c++·算法·蓝桥杯
在京奋斗者4 小时前
spring boot自动装配原理
java·spring boot·spring
明天不下雨(牛客同名)7 小时前
为什么 ThreadLocalMap 的 key 是弱引用 value是强引用
java·jvm·算法
多多*7 小时前
Java设计模式 简单工厂模式 工厂方法模式 抽象工厂模式 模版工厂模式 模式对比
java·linux·运维·服务器·stm32·单片机·嵌入式硬件
白夜易寒8 小时前
Docker学习之私有仓库(day10)
学习·docker·容器
淮北4948 小时前
ros调试工具foxglove使用指南三:在3d空间写写画画(Panel->3D ->Scene entity)
python·学习·3d·机器人