java的四种内部类详解

Java的四种内部类详解

一、静态内部类(Static Inner Class)
  1. 定义:使用static修饰的成员内部类,独立于外部类实例存在。
  2. 访问权限
    • 可直接访问外部类的静态成员(包括private修饰的)。
    • 无法直接访问外部类的非静态成员,需通过外部类实例间接访问。
  3. 特点
    • 可以定义静态成员和方法。
    • 创建方式:外部类名.静态内部类名,无需外部类实例。
    • 应用场景:适用于与外部类关联紧密但不依赖实例的场景,如Java集合类HashMap中的Entry类。

二、成员内部类(Member Inner Class)
  1. 定义:定义在外部类成员位置(非静态、非方法内)的非静态类。
  2. 访问权限
    • 可直接访问外部类的所有成员(包括私有和非静态成员)。
    • 不能定义静态成员final修饰的常量除外)。
  3. 特点
    • 依赖外部类实例,需通过外部类实例.new 成员内部类()创建对象。
    • 编译后生成独立的.class文件(如外部类名$内部类名.class)。
    • 应用场景:需频繁访问外部类实例的场景。

三、局部内部类(Local Inner Class)
  1. 定义:定义在方法或代码块中的类,作用域仅限于该方法或代码块。
  2. 访问权限
    • 可访问外部类的所有成员及方法内的final或有效final局部变量。
    • 不能定义静态成员
  3. 特点
    • 必须在定义它的方法内实例化。
    • 应用场景:仅在特定方法内使用的辅助类。

四、匿名内部类(Anonymous Inner Class)
  1. 定义:无名称的内部类,通常用于一次性实现接口或继承类。
  2. 特点
    • 必须继承一个类或实现一个接口,且只能继承/实现一个。
    • 不能有构造方法、静态成员或public/protected/private修饰符。
    • 应用场景:快速实现回调(如事件监听器)或简化代码。
  3. 示例
     

    java

    new Thread() {
        @Override
        public void run() {
            System.out.println("匿名内部类实现线程");
        }
    }.start();

总结对比

类型 静态成员 访问外部类非静态成员 实例化方式 应用场景
静态内部类 ✔️ 外部类名.静态内部类名 独立关联外部类的工具类
成员内部类 ❌(final除外) ✔️ 外部类实例.new 成员内部类() 需频繁访问外部类实例的场景
局部内部类 ✔️(final或有效final 方法内直接实例化 仅在方法内使用的辅助类
匿名内部类 ❌(需通过继承/实现间接访问) new 父类/接口(){...} 一次性实现接口或继承类

你可能感兴趣的:(java,开发语言)