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.设计模式
设计模式是代码设计经验的总结,一般代表了最佳实践。
如果对您有帮助,请点赞关注支持我,谢谢!❤
如有错误或者不足之处,敬请指正!❤