Day18-面向对象高级三
进阶三
内部类
什么是内部类
- 是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类。
- 场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。

四种内部类
成员内部类
就是类中的一个普通成员。

成员内部类的创建。

和前面学过的实例方法一样,成员内部类的实例方法中,同样可以直接访问外部类的实例成员、静态成员。
可以在成员内部类的实例方法中,拿到当前外部类对象,格式是:外部类名.this。
静态内部类
有static修饰的内部类,属于外部类自己持有。

静态内部类的创建。

可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员。
局部内部类(基本没用)
- 局部内部类是定义在在方法中、代码块中、构造器等执行体中的类。
匿名内部类(重点)
就是一种特殊的局部内部类;所谓匿名:指的是程序员不需要为这个类声明名字。

特点:匿名内部类本质就是一个子类,并会 立即 创建出一个 子类对象。
作用:用于更方便的创建一个子类对象。(不用再专门定义一个类)
匿名内部类在开发中的使用场景:通常作为一个参数传输给方法。(一般都是调别人的API 不会自己写 核心目的是简化代码)
枚举
什么是枚举
- 枚举是一种类
- 枚举的格式

- 枚举类中的第一行,只能写一些合法的标识符(名称),多个名称用逗号隔开。
- 这些名称,本质是常量,每个常量都会记住枚举类的一个对象。

枚举的特点(已经创建好多个对象的单例类)
- 枚举类的第一行只能罗列一些名称,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象。
- 枚举类的构造器都是私有的(写不写都只能是私有的),因此,枚举类对外不能创建对象。
- 枚举都是最终类,不可以被继承。
- 枚举类中,从第二行开始,可以定义类的其他各种成员。
- 编译器为枚举类新增了几个方法,并且枚举类都是继承:Java.lang.Enum 类的,从enum类也会继承到一些方法。
用枚举构建单例类设计模式

枚举的常见应用场景
- 选择定义一个一个的常量来表示一组信息,并作为参数传输。
- 参数值不受约束。
- 经常作为switch选择结构的入参


- 使用枚举可以让代码可读性好,参数值得到了约束,对使用者更友好。
泛型
什么是泛型
- 定义类、接口、方法时,同时声明了一个或者多个类型变量(如:
),称为泛型类、泛型接口,泛型方法、它们统称为泛型。

- 作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力!这样可以避免强制类型转换,及其可能出现的异常。
- 泛型的本质:把具体的数据类型作为参数传给类型变量。
泛型类
- 可以约束传入的数据。

1 | public class A<E>{} //约束一个参数 |
泛型接口
- 根据不同的参数进行不同的实现。

- 例:系统要处理老师和学生的数据,提供保存和查询功能。




- 注意:类型变量建议用大学英文字母,常用E、T、K、V等。
泛型方法
- 构建泛型方法

集和泛型的拓展:
- 用 “?” 代表一切类型
- ? extends 上限类 入参必须是上线类或其子类
- ? super 下限类 入参必须是下限类或其父类

小结:
- 通配符”?”可以在“使用泛型”的时候代表一切类型;ETKV是在定义泛型的时候使用。
- 泛型上限:? extends Car 表示?能接收的必须是Car或者其子类。
- 泛型下限:? super Car 表示?能接收的必须是Car或者其父类。
泛型的擦除问题和注意事项
- 泛型是工作在编译阶段的,一旦程序编译成class文件,class文件中就不存在泛型了,这就是泛型擦除。
- 泛型不支持基本数据类型,只能支持对象类型(引用数据类型)。 (如 ArrayList
报错 应该用 ArrayList
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 宫本贩剑的博客!