内部类
一锅炖不下
  1. 内部类访问特点:
  • 内部类可以直接访问外部类成员,包括私有
  • 外部类要访问内部类成员,必须创建对象
  1. 概念:

B类表示的事物是A类的一部分,单独存在没有意义,则B类可以设计为A类的内部类

  1. 内部类的分类

    • 成员内部类
    • 静态内部类
    • 局部内部类
    • 匿名内部类(重要)
  2. 成员内部类

    • 修饰符

      • private:只能在外部类中创建使用
      • 默认:只能在本包中使用
      • protected
        • 在定义它的外部类所属包中,所有类都可以访问这个内部类(与默认权限一样)。
        • 在其它包中,只有继承了该外部类的子类,才能访问该成员内部类。
        • 成员内部类可以通过外部类的实例访问。
      • public:所有地方都可用
      • static:静态内部类
    • 如何创建内部类对象

      • 在外部类中编写方法,对外提供内部类对象
      • 直接创建:外部类名.内部类名 对象名 = new 外部类对象.内部类对象;
    • 访问外部类中同名变量

      1
      Outer.this.a;
  3. 静态内部类——特殊成员内部类

    • 约束:
      • 静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象
    • 创建:
      • 外部类名.内部类名 对象名 =new 外部类名.内部类名();
    • 调用静态方法:外部类名.内部类名.方法名();
  4. 局部内部类——基本上没啥用

    • 含义:定义在方法里面的内部类,类似于局部变量、

    • 外界无法直接使用,只能在方法中使用

    • 什么场景会用呢

      场景 原因
      事件监听/回调只在方法里使用一次 避免创建额外类文件,代码更聚合
      特定方法中需要封装小逻辑 提高可读性又不污染类结构
      与方法中的局部变量强耦合的逻辑 局部内部类可以访问 final 或 effectively final 的局部变量3
  5. 匿名内部类——重要,相比起来应用范围更广,主要是可以简化代码

    • 本质:没有名字的子类或实现类

    • 格式:

      new 类名或者接口名(){

      ​ 重写方法;
      };

    • 解决的问题:对于只用一次的类,不用专门编写一个继承类或者实现类