Java中的内部类和匿名内部类是一种特殊的类定义方式,可以在一个类内部定义另外一个类。
1、内部类:内部类是指在一个类的内部定义的类。它与普通的类不同,它可以直接访问外部类的成员,包括私有成员,而且还可以使用外部类的引用。内部类提供了一种更加灵活的封装方式,有助于组织复杂的代码结构。Java中有四种类型的内部类:成员内部类、局部内部类、匿名内部类和静态内部类。
(1)成员内部类:成员内部类定义在外部类的成员位置,可以访问外部类的所有成员变量和方法。使用格式为:外部类名.内部类名 in =外部类对象.new 内部类名();
(2)局部内部类:局部内部类定义在方法或作用域内部,只能在所在的方法或作用域中访问。局部内部类可以定义在代码块内部,对外部类的访问权限与它们所在的方法或作用域相同。
(3)匿名内部类:匿名内部类没有名字,直接在创建对象的地方进行定义和实例化。一般用来简化代码,减少类的定义。匿名内部类常用于实现接口或继承抽象类。
(4)静态内部类:静态内部类是在一个类内部定义的静态类,它不依赖于外部类的实例,可以直接使用外部类的静态成员,而不需要创建外部类对象。

内部类的特点:
(1)内部类可以访问外部类的所有成员,包括私有成员。
(2)外部类不能直接访问内部类的成员,需要通过内部类的实例来访问。
(3)内部类拥有对外部类的引用,可以使用外部类的引用访问外部类的成员。
2、匿名内部类:匿名内部类是指在创建对象时,同时定义和实现该类的一个对象,而无需单独命名这个类。它通常用于简化代码和处理一些临时的逻辑。匿名内部类一般用于实现接口、继承抽象类或访问局部变量。
使用格式为:
new 父类构造器(参数列表)实现接口(){//类体部分}
匿名内部类的特点:
(1)匿名内部类没有类名,所以无法创建多个对象。
(2)匿名内部类必须要继承一个父类或者实现一个接口。
(3)匿名内部类可以访问外部类的成员变量和方法,并且可以访问 final 的局部变量。
(4)匿名内部类只能在定义它的方法或代码块中使用,一般用于方法内部、构造函数内部或代码块内部。
区别与联系:
(1)内部类是有名字的,可以独立存在。而匿名内部类没有名字,必须依附于其他类存在。
(2)内部类可以有自己的构造方法和成员变量,而匿名内部类不能有构造方法和成员变量。
(3)内部类可以被继承和实例化,而匿名内部类只能被实例化一次。
(4)内部类使用起来相对灵活,可以随意访问外部类的成员。而匿名内部类通常用于简化代码,减少类的定义。