在Java中内部类主要分为:
成员内部类:
- 成员内部类中不能存在任何static的变量和方法
- 成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类
静态内部类 :
关键字static可以修饰成员变量、方法、代码块,其实它还可以修饰内部类,使用static修饰的内部类我们称之为静 态内部类。静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地 保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着: - 静态内部类的创建是不需要依赖于外围类,可以直接创建
- 静态内部类不可以使用任何外围类的非static成员变量和方法,而内部类则都可以
方法内部类:
方法内部类定义在外部类的方法中,局部内部类和成员内部类基本一致,只是它们的作用域不同,方法内部类只能 在该方法中被使用,出了该方法就会失效。 对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来 辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类。
匿名内部类 :
匿名内部类其实就是一个没有名字的方法内部类,所以它符合方法内部类的所有约束.除此之外,还有一些地方需要 注意 :
- 匿名内部类是没有访问修饰符的。
- 匿名内部类必须继承一个抽象类或者实现一个接口
- 匿名内部类中不能存在任何静态成员或方法
- 匿名内部类是没有构造方法的,因为它没有类名。
- 与局部内部相同匿名内部类也可以引用方法形参。此形参也必须声明为 final
- 内部类方法可以访问该类定义所在作用域中的数据,包括被 private 修饰的私有数据
- 内部类可以对同一包中的其他类隐藏起来
- 内部类可以实现 java 单继承的缺陷
- 当我们想要定义一个回调函数却不想写大量代码的时候我们可以选择使用匿名内部类来实现
对于非静态内部类,内部类的创建依赖外部类的实例对象,在没有外部类实例之前是无法创建内部类的 内部类是一个相对独立的实体,与外部类不是is-a关系 内部类可以直接访问外部类的元素(包含私有域),但是外部类不可以直接访问内部类的元素 外部类可以通过内部类引用间接访问内部类元素