Java中的内部类、枚举

内部类、枚举

  • 内部类
    • 成员内部类
    • 静态内部类
    • 局部内部类(不重要)
    • 匿名内部类(重要)
      • 什么是匿名内部类
      • 使用场景
  • 枚举类
    • 什么是枚举类
    • 枚举类的特点
      • 枚举类提供的一些额外API
      • 拓展:抽象枚举
        • 使用枚举类实现单例设计模式
    • 常见应用场景

内部类

内部类是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类。

场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。

如:汽车里面有一个发动机,就可以把发动机类定义在汽车类里面

内部类有四种形式:

  • 成员内部类
  • 静态内部类
  • 局部内部类
  • 匿名内部类

成员内部类

是类中的一个普通成员,类似普通的成员变量、成员方法。
Java中的内部类、枚举_第1张图片
成员内部类的成分都有:成员变量(普通、静态static成员「JDK16才开始支持」)、成员方法

访问成员内部类的方法:内部类依赖于外部类

Outer.Inner in = new Outer().new Inner();

成员内部类中访问其他成员的特点:

  1. 成员内部类可以直接访问外部类的实例成员、静态成员;
  2. 当如果内部类和外部类中有相同名称的变量,使用格式:外部类名.this
    Java中的内部类、枚举_第2张图片

静态内部类

有static修饰的内部类,属于外部类自己持有
Java中的内部类、枚举_第3张图片
静态内部类的成分:类有的它都有

访问静态内部类的方法:由于是静态可以直接用.调用出来

Outer.Inner in = new Outer.Inner();

静态内部类中访问其他成员的特点:

  1. 成员内部类只能直接访问外部类的静态成员,不能直接方法外部类的实例成员;
    Java中的内部类、枚举_第4张图片

局部内部类(不重要)

局部内部类是定义在方法中、代码块中、构造器等执行体中
Java中的内部类、枚举_第5张图片

匿名内部类(重要)

什么是匿名内部类

一种特殊的局部内部类;所谓匿名:指的是不需要为这个类声明名字
Java中的内部类、枚举_第6张图片
Java中的内部类、枚举_第7张图片

编译器遇到匿名内部类:

  1. 特点:把这个匿名内部类编译成一个子类,然后会立即创建一个类对象出来
  2. 作用:用于更方便的创建一个子类对象

Java中的内部类、枚举_第8张图片左边是Java类代码,右边是编译后的class文件

使用场景

通常作为一个参数传输给方法
Java中的内部类、枚举_第9张图片
可以改写为:直接在调用函数的时候创建匿名内部类
Java中的内部类、枚举_第10张图片

Java中的内部类、枚举_第11张图片

枚举类

什么是枚举类

是一种特殊的类:是一种固定数量的类
Java中的内部类、枚举_第12张图片
枚举类中的第一行,只能写一些合法的标识符(名称),多个名称用逗号隔开;
这些名称,本质是常量,每个常量都会记住枚举类的一个对象。

反编译可以看到
Java中的内部类、枚举_第13张图片

Java中的内部类、枚举_第14张图片

枚举类的特点

Java中的内部类、枚举_第15张图片

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

枚举类提供的一些额外API

Java中的内部类、枚举_第16张图片

拓展:抽象枚举

在枚举中添加了一个抽象方法
Java中的内部类、枚举_第17张图片
构建对象的时候要重写抽象方法

使用枚举类实现单例设计模式

Java中的内部类、枚举_第18张图片

常见应用场景

用来表示一组信息,然后作为参数进行传输。
做信息标志和分类
Java中的内部类、枚举_第19张图片

你可能感兴趣的:(Java学习路线,java,开发语言)