1、成员内部类
内部类:在一个类的内部定义一个内部类。
特点:
1、 内部类可以使用 private 修饰,表示私有。 只能在外部类当中去使用。
2、 内部类不会单独生成一个 java 文件
内部类编译后生成一个 class 文件:例如 FirstOuterClass$FirstInnerClass.class
命名规则:外部类名+ $ +内部类名称.class
为什么叫成员内部类: 内部类定义的位置处于外部类成员的位置,所以叫成员内部类。
1.1、构建内部类对象
两种方法:
1、 在外部类的非静态方法中去 new 一个内部类对象。
2、 通过外部类对象去构造一个内部类对象。
语法:外部类对象.new 内部类名();
内部类的好处:
1、隐藏内部类的细节。
2、内部类没有单独的 java 文件,省去维护大量的 java 文件。
2、局部内部类
2.1、特点:局部内部类和成员内部类区别是所处的位置不同。 局部内部类相当于一个局部变量,在一个方法中或局部代码块中定义一个类,叫作局部内部类。
1、 局部内部类只能在其作用域之中被实例化。不能使用外部类对象去实例化一个局部内部类对象。
2、 局部内部类不能去使用 public、private ,因为局部内部类不是外部类的成员。
3、 局部内部类可以访问外部类对象的成员,拥有外部类对象的引用。
4、 局部内部类只允许使用它之外的 final 常量。
2.2、final 常量的问题
Local variable a defined in an enclosing scope must be final or effectively final 在封闭范围内(局部内部类)如果要使用它之外的局部变量,只能 final 常量。
注意:在局部内部类中可以去定义一个局部变量!!!!如果要使用它之外的局部变量,此时编译器按 final 处理。
为什么有这个限制?
局部变量和局部内部类生命周期不同,由于它们的生命周期不同所以编译器统一要求,如果局部内部类使用了它之外的局部变量, 此时编译器按 final 处理。
如果出现这种情况,在 jdk7 中强制要求局部变量定义为 final。jdk8 自动将局部变量按 final 处理。
3、匿名内部类
匿名内部类是一种特殊的局部内部类,它没有名字,所以叫匿名内部类。
定义匿名内部类格式:
new 父类或接口(){
//写类的成员
//重写父类或接口中的方法..
};
匿名内部类特点:
1、 匿名内部类没有名字
2、 匿名内部类是一个特殊的局部内部类,不能使用 public、private 等权限修饰。
3、 匿名内部类由于没有名字,不能定义构造方法。 使用构造代码块实现构造方法的功能。
4、 无法通过外部类对象进行实例化,可以访问外部类对象的引用。
5、 匿名内部类要么继承一个父类,要么实现一个接口,两者不能兼备!!
6、 匿名内部类可以访问外部类对象的成员
7、 匿名内部类只允许使用它之外的 final 常量。
4、静态内部类
成员内部类使用 static 修饰,它就是静态内部类:
1、 静态内部类不能访问外部类的非静态成员。只能访问静态成员。
2、 静态内部类不依赖外部类对象而存在,无法拥有外部类对象的引用,构造一个静态内部类无需 使用外部类对象的。
3、 静态内部类可以有静态成员,成员内部类不能有静态成员。
创建一个静态内部类对象语法:new 外部类名.静态内部类名();