一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类 (inner class),嵌套其他类的类称为外部类(outer class)。是我们类的第五大成员(属性、方法、构造器、代码块、内部类)。内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系。底层源码有大量的内部类。

分类:
定义在外部类局部位置上:
局部内部类(有类名)
匿名内部类(无类名)
定义在外部类成员位置上:
成员内部类(没有static修饰)
静态内部类(使用static修饰)

局部内部类

局部内部类是定义在外部类的局部位置,比如方法中,并且有类名。

  1. 可以直接访问外部类的所有成员,包含私有的
  2. 不能添加访问修饰符,因为它的地位就是一个局部变量。局部变量是不能使用

修饰符的,但是可以使用final修饰,因为局部变量也可以使用final

  1. 作用域:仅仅在定义它的方法或代码块中

匿名内部类

匿名内部类是定义在外部类的局部位置,比如方法中,并且没有类名

  1. 语法:

new 类或接口(参数列表){
类体
}

  1. 匿名内部类的语法比较奇特,因为匿名内部类既是一个类的定义,同时它本身也是一个对象,因此从语法上看,它既有定义类的特征,也有创建对象的特征,因此可以调用匿名内部类方法

image.png image.png

  1. 自我理解:匿名内部类是继承或实现,经常在调用方法时形参中直接new一个匿名内部类。编译类型是父类或接口,运行类型为此匿名内部类。

成员内部类

成员内部类是定义在外部类的成员位置,并且没有static修饰

  1. 可以添加任意一个访问修饰符,因为他的地位就是一个成员

静态内部类

静态内部类是定义在外部类的成员位置,并且有static修饰

  1. 不能直接访问非静态成员

小结

  1. 内部类可以直接访问外部类的所有成员,包括私有的。但静态内部类不能直接访问非静态成员
  2. 作用域:定义在局部位置为方法体或代码块,定义在成员位置为整个类体
  3. 外部类访问内部类成员:先创建对象在访问(作用域内)
  4. 内外部类成员重名时,默认遵循就近原则,如果想访问外部类成员,可以使用 外部类名.this.成员 访问