一:内部类

1.概念

定义在其他类内部的类叫做内部类

2.访问特征

  • 内部成员可以直接访问外部类成员,包括私有
  • 外部类要访问内部类的成员,必须创建对象

    3.内部类的分类

    一:成员位置内部类

    1. 1. 定义在类中,方法体之外,可以看做是外部类的一个普通成员,内部类依赖着外部类对象而存在
    2. 1. 创建内部类对象:
    3. 1. 外部类中,和创建普通对象没啥区别
    4. 1. 外部类的外部, 外部类名. 内部类名 对象名 = 外部类对象.内部类对象
    5. 3. 成员内部类常用修饰符:
    6. 1. private:保证成员位置内部类只对外部类可见
    7. 1. static
    8. 1. 整个内部类,就变成了一个静态上下文
    9. 1. 内部类不再依赖于外部类对象而存在

    二:局部位置内部类

    1. 1. 定义在类中,方法体之外
    2. 1. 创建:局部内部类,只能在定义内部类的方法体中创建该类对象
    3. 1. 访问特征:
    4. 1. 局部内部类除了有所有内部类共有的访问特征之外,还可以访问方法体中的局部变量(但只能访问final的局部变量)
    5. 1. 原因:
    6. 1. 局部变量存储在栈帧中,栈帧随方法的结束而被销毁,而局部内部类对象并不一定随着方法的执行而被销毁(即方法执行结束后,局部变量已经不存在,而匿名内部类对象还存在,因此他就可以去访问那个已经不存在的局部变量

    三:匿名内部类对象:

    1. 1. 本质:是一个继承了类或者实现了接口的匿名子类 匿名对象
    2. 1. 优点:
    3. 1. 不管是成员还是局部位置内部类,我们要使用内部类都分成了两步:定义内部类 创建内部类对象,通过定义匿名内部类对象,我们可以将上面的两步分为一步
    4. 3. 前提:存在一个类或者接口,这里的类可以是具体类也可以是抽象类
    5. 3. 语法: new 类名或者接口名(){重写方法}
    6. 3. 访问特征:
    7. 1. 一个匿名内部类对象,因为是个匿名 对象,所以每访问一次成员都需要创建一个对象(除非用一个引用变量指向该对象)
    8. 6. 使用场景:
    9. 1. 只使用某抽象类,或者接口子类对象一次的情况下使用:
    10. 1. 方法的形式参数是引用类型(特别是接口的情况)
    11. 1. 当方法返回的是一个接口类型的子类对象的时候