6.内部类
内部类定义:在类内部可定义成员变量和方法,且在类内部也可以定义另一个类。如果在类 Outer 的内部再定义一个类 Inner,此时类 Inner 就称为内部类,而类 Outer 则称为外部类。
1.实例内部类
实例内部类是指没有用 static 修饰的内部类。
1 | public class Outer { |
特点:
- 在外部类的静态方法和外部类以外的其他类中,必须通过外部类的实例创建内部类的实例。
- 在实例内部类中,可以访问外部类的所有成员。
- 在实例内部类中不能定义 static 成员,除非同时使用 final 和 static 修饰。
- 在外部类中不能直接访问内部类的成员,而必须通过内部类的实例去访问。
- 一个内部类实例只对应一个外部类实例,而一个外部类实例则可以对应多个内部类实例。
- 在实例内部类中不能定义 static 成员,除非同时使用 final 和 static 修饰。
2.静态内部类
静态内部类是指使用 static 修饰的内部类。
1 | public class Outer { |
特点:
- 在创建静态内部类的实例时,不需要创建外部类的实例
- 静态内部类中可以定义静态成员和实例成员。外部类以外的其他类需要通过完整的类名访问静态内部类中的静态成员,如果要访问静态内部类中的实例成员,则需要通过静态内部类的实例。
- 静态内部类可以直接访问外部类的静态成员,如果要访问外部类的实例成员,则需要通过外部类的实例去访问。(因为静态类和静态变量编译时先加载)
3.局部内部类
局部内部类是指在一个方法中定义的内部类。
1 | public class Test { |
特点:
- 局部内部类与局部变量一样,不能使用访问控制修饰符(public、private 和 protected)和 static 修饰符修饰。
- 局部内部类只在当前方法中有效。
- 局部内部类中不能定义 static 成员。
- 局部内部类中还可以包含内部类,但是这些内部类也不能使用访问控制修饰符(public、private 和 protected)和 static 修饰符修饰。
- 在局部内部类中可以访问外部类的所有成员。
4.匿名类(重点)
匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类。其语法形式如下:
1 | new <类或接口>() { |
匿名类有两种实现方式:
- 继承一个类,重写其方法。
- 实现一个接口(可以是多个),实现其方法。
特点:
- 匿名类和局部内部类一样,可以访问外部类的所有成员。如果匿名类位于一个方法中,则匿名类只能访问方法中 final 类型的局部变量和参数。
- 匿名类中允许使用非静态代码块进行成员初始化操作。
- 匿名类的非静态代码块会在父类的构造方法之后被执行。
评论