内部类、枚举
- 内部类
- 成员内部类
- 静态内部类
- 局部内部类(不重要)
- 匿名内部类(重要)
- 什么是匿名内部类
- 使用场景
- 枚举类
- 什么是枚举类
- 枚举类的特点
- 枚举类提供的一些额外API
- 拓展:抽象枚举
- 使用枚举类实现单例设计模式
- 常见应用场景
内部类
内部类是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类。
场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。
如:汽车里面有一个发动机,就可以把发动机类定义在汽车类里面
内部类有四种形式:
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
成员内部类
是类中的一个普通成员,类似普通的成员变量、成员方法。
成员内部类的成分都有:成员变量(普通、静态static成员「JDK16才开始支持」)、成员方法
访问成员内部类的方法:内部类依赖于外部类
Outer.Inner in = new Outer().new Inner();
成员内部类中访问其他成员的特点:
- 成员内部类可以直接访问外部类的实例成员、静态成员;
- 当如果内部类和外部类中有相同名称的变量,使用格式:外部类名.this
静态内部类
有static修饰的内部类,属于外部类自己持有
静态内部类的成分:类有的它都有
访问静态内部类的方法:由于是静态可以直接用.
调用出来
Outer.Inner in = new Outer.Inner();
静态内部类中访问其他成员的特点:
- 成员内部类只能直接访问外部类的静态成员,不能直接方法外部类的实例成员;
局部内部类(不重要)
局部内部类是定义在方法中、代码块中、构造器等执行体中
匿名内部类(重要)
什么是匿名内部类
一种特殊的局部内部类;所谓匿名:指的是不需要为这个类声明名字
编译器遇到匿名内部类:
- 特点:把这个匿名内部类编译成一个子类,然后会立即创建一个类对象出来
- 作用:用于更方便的创建一个子类对象
左边是Java类代码,右边是编译后的class文件
使用场景
通常作为一个参数传输给方法
可以改写为:直接在调用函数的时候创建匿名内部类
枚举类
什么是枚举类
是一种特殊的类:是一种固定数量的类
枚举类中的第一行,只能写一些合法的标识符(名称),多个名称用逗号隔开;
这些名称,本质是常量,每个常量都会记住枚举类的一个对象。
反编译可以看到
枚举类的特点
- 枚举类的第一行只能罗列名称,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象
- 枚举类的构造器都是私有的(写不写都只是私有的),因此,枚举类对外不能创建对象。
- 枚举类都是最终类,不可以被继承
- 枚举类中,从第二行开始,可以定义类的其他各种成员
- 编译器为枚举类新增类几个方法,并且枚举类都是继承:java.lang.Enum类的,从enum类也会继承到一些方法
枚举类提供的一些额外API
拓展:抽象枚举
在枚举中添加了一个抽象方法
构建对象的时候要重写抽象方法
使用枚举类实现单例设计模式
常见应用场景
用来表示一组信息,然后作为参数进行传输。
做信息标志和分类