前言

前面基本上对内部类有一个认识了,内部类可以分为四种:

  • 成员内部类
  • 静态内部类
  • 局部内部类
  • 匿名内部类

成员内部类

特征:

  • 声明在类内部,方法外部
  • 没有static修饰
  • 不能包含静态属性和静态方法(静态常量除外,final static int i = 0;)
  • 在拥有外部类对象之前是不能拥有内部类对象的
  • 在外部类对象创建内部类的同时,内部类自动拥有一个外部类的引用,可以访问外部类对象的所有成员,包括private
  • 外部类无法访问直接访问成员内部类的方法和属性,需要通过内部类的一个实例来访问
  • 创建的格式如下,必须通过外部类对象.new的方式进行创建
1
Animal.Bird bird = new Animal().new Bird();
  • 编译后的文件为Animal.class和Animal$Bird.class

静态内部类

特征:

  • 声明在类内部,方法外部
  • 有static修饰
  • 只能访问外部类的静态成员属性或静态访问
  • 创建格式如下,无需外部类的实例对象即可创建
1
Animal.Fish fish = new Animal.Fish();

局部内部类

特征:

  • 存在于方法的作用域内
  • 不能使用权限访问修饰符进行修饰
  • 不是外围类的一部分
  • 可以访问当前代码块里面的常量(在jdk1.8之后限制有所放宽,可以访问代码里面“形式上不变的变量–初始化之后不再改变的变量”)
  • 可以访问外围类的所有成员(static和非static都可以访问)

匿名内部类

特征:

  • 没有名字的局部内部类
  • 因为没有名字,所以只能使用一次,创建实例后,类的定义就会消失
  • 必须继承一个类或者实现一个接口
  • 没有构造方法,因为没有类名,拥有与父类相同的所有构造方法
  • 可以定义代码块,但是不能定义静态代码块