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.设计模式

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

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

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

相关推荐
ImomoTo38 分钟前
HarmonyOS学习(十三)——数据管理(二) 关系型数据库
数据库·学习·harmonyos·arkts·鸿蒙
Dola_Pan3 小时前
Linux文件IO(二)-文件操作使用详解
java·linux·服务器
wang_book3 小时前
Gitlab学习(007 gitlab项目操作)
java·运维·git·学习·spring·gitlab
weixin_455446173 小时前
Python学习的主要知识框架
开发语言·python·学习
蜗牛^^O^4 小时前
Docker和K8S
java·docker·kubernetes
从心归零4 小时前
sshj使用代理连接服务器
java·服务器·sshj
IT毕设梦工厂5 小时前
计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
Ylucius6 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
LvManBa6 小时前
Vue学习记录之六(组件实战及BEM框架了解)
vue.js·学习·rust