一、概念1.定义在一个类的内部再定义一个完整的类里面的类称为内部类外面包裹它的类称为外部类。2.核心特点1内部拥有独立的类文件编译后生成.class 文件命名 外部类类名$内部类类名.class2内部类可以直接访问外部类所有成员包括私有3外部类访问内部类成员必须先创建内部类对象4内部类是独立的作用域不会和外部类成员重名冲突3.使用场景封装辅助逻辑、回调、简化代码匿名内部类二、内部类的分类1.成员内部类类比于实例变量写在外部类成员位置不被 static 修饰。特性1以来外部类实例必须先创建外部类对象才能创建内部类对象2不能定义静态变量、静态方法常量 static final 除外3可直接访问外部类所有属性 / 方法区分同名变量外部类名.this.成员2.静态内部类类比于静态变量成员位置被 static 修饰也叫嵌套类特性1不依赖外部类对象可直接通过外部类类名创建2只能访问外部类静态成员不能直接访问外部实例变量3可以定义静态变量、静态方法3.局部内部类类比于局部变量定义在方法 / 代码块内部作用域仅限当前方法出方法失效特性1作用域极小外部无法访问仅方法内可用2JDK8 方法中局部变量被内部类使用自动隐式 final 不可二次修改3不能使用访问修饰符public / private / protected4.匿名内部类是一个特殊的局部内部类没有类名的局部内部类一次性使用常用于接口 / 抽象类快速实现特性1没有构造方法只有创建一次对象2必须继承父类 / 实现接口3本质一次性子类实现简化回调、线程、监听器代码4匿名内部类的优缺点优点减小代码量让编程思路连贯缺点可读性低三、高频面试重点1.成员内部类为什么不能有 static 变量成员内部类依附外部类对象存在静态属于类生命周期冲突。2.匿名内部类和 Lambda 的区别匿名内部类可重写多个方法Lambda 只能用于函数式接口一个抽象方法。3.局部内部类使用局部变量为什么不能修改内部类对象生命周期可能长于方法局部变量为避免数据不一致强制隐式 final。