1. 内部类( Inner class )定义
(1)当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。
(2)在 Java 中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。
(3)内部类一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。 Inner class 的名字不能与包含它的外部类类名相同;
───────────────────────────────────────────────────────────
2. 内部类分类
(1)成员内部类(static 成员内部类和非 static 成员内部类)
(2)局部内部类(方法体内、代码块、构造器)、匿名内部类
────────────────────────────────────────────────────────────
3. 成员内部类作为类的成员的角色
(1)和外部类不同,内部类除了可以被 public 和 default 修饰外,还可以声明为 private 或 protected;
(2)可以调用外部类的结构
(3)内部类可以声明为 static 的,但此时就不能再使用外层类的非 static 的成员变量;
────────────────────────────────────────────────────────────
4. 成员内部类作为类的角色
(1)在内部类中可以定义属性、方法、构造器等结构。
(2)内部类可以被 abstract 修饰 ,因此可以被其它的内部类继承。
(3)内部类可以被 final 修饰,表示此类不能被继承
(4)编译以后生成OuterClass$InnerClass.class字节码文件(也适用于局部内部类)
────────────────────────────────────────────────────────────
5. 注意
(1)非 static 的成员内部类中的成员不能声明为 static 的,只有在外部类或 static 的成员内部类中才可声明 static 成员。
(2)外部类访问成员内部类的成员,需要“内部类.成员”或“内部类对象.成员”的方式
(3)成员内部类可以直接使用外部类的所有成员,包括私有的数据
(4)当想要在外部类的静态成员部分使用内部类时,可以考虑内部类声明为静态的
────────────────────────────────────────────────────────────
6. 关注如下的3个问题
(1)如何实例化成员内部类的对象
静态成员内部类 | 外部类.内部类 对象名 = new 外部类.内部类(); |
非静态成员内部类 | 外部类.内部类 对象名 = 外部类对象.new 内部类(); |
(2)如何在成员内部类中区分调用外部类的结构
|
(3)开发中局部内部类的使用:通过内部类实现某个接口返回一个对象
|
(4)注意点:
在局部内部类的方法中( 比如:show 如果调用局部内部类所声明的方法 ( 比如:method ) 中的局部变 量( 比如:num ) 的话,要求此局部变量声明为 final 的。 JDK 7 及之前版本:要求此局部变量显式的声明为 final 的 JDK 8 及之后的版本:可以省略 final 的声明 |
────────────────────────────────────────────────────────────
6. 总结
(1)成员内部类和局部内部类,在编译以后,都会生成字节码文件。
成员内部类 | 外部类$内部类名.class |
局部内部类 | 外部类$数字 内部类名.class |