一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类 (inner class),嵌套其他类的类称为外部类(outer class)。是我们类的第五大成员(属性、方法、构造器、代码块、内部类)。内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系。底层源码有大量的内部类。
分类:
定义在外部类局部位置上:
局部内部类(有类名)
匿名内部类(无类名)
定义在外部类成员位置上:
成员内部类(没有static修饰)
静态内部类(使用static修饰)
局部内部类
局部内部类是定义在外部类的局部位置,比如方法中,并且有类名。
- 可以直接访问外部类的所有成员,包含私有的
- 不能添加访问修饰符,因为它的地位就是一个局部变量。局部变量是不能使用
修饰符的,但是可以使用final修饰,因为局部变量也可以使用final
- 作用域:仅仅在定义它的方法或代码块中
匿名内部类
匿名内部类是定义在外部类的局部位置,比如方法中,并且没有类名
- 语法:
new 类或接口(参数列表){
类体
}
- 匿名内部类的语法比较奇特,因为匿名内部类既是一个类的定义,同时它本身也是一个对象,因此从语法上看,它既有定义类的特征,也有创建对象的特征,因此可以调用匿名内部类方法
- 自我理解:匿名内部类是继承或实现,经常在调用方法时形参中直接new一个匿名内部类。编译类型是父类或接口,运行类型为此匿名内部类。
成员内部类
成员内部类是定义在外部类的成员位置,并且没有static修饰
- 可以添加任意一个访问修饰符,因为他的地位就是一个成员
静态内部类
静态内部类是定义在外部类的成员位置,并且有static修饰
- 不能直接访问非静态成员
小结
- 内部类可以直接访问外部类的所有成员,包括私有的。但静态内部类不能直接访问非静态成员
- 作用域:定义在局部位置为方法体或代码块,定义在成员位置为整个类体
- 外部类访问内部类成员:先创建对象在访问(作用域内)
- 内外部类成员重名时,默认遵循就近原则,如果想访问外部类成员,可以使用 外部类名.this.成员 访问