1 内部类与外部类的区别
- 内部类(除了局部内部类和匿名内部类)比外部类可以多使用三个修饰符:private、protected、static
- 非静态内部类不能拥有静态成员
2 内部类的分类
- 成员内部类
- 非静态内部类
- 静态内部类
- 局部内部类
- 匿名内部类
3 非静态内部类
- 非静态内部类不能有静态成员。
- 如果外部类成员变量、内部类成员变量与内部类方法的局部变量重名、可以通过 外部类类名.this、this来区分。
- 外部类静态成员不能直接(可以通过创建实例)访问非静态内部类的变量、方法,包括创建实例。
4 静态内部类
- 外部类的上一级是包,所以不可使用static修饰。但是静态内部类的上一级是外部类,可以使用static修饰。
- 静态内部类只能访问外部内部类的静态成员。
- 外部类内部类只能直接(可以通过创建实例访问其他的成员)访问静态内部类的静态成员。
- 接口内部类只能是静态内部类,默认使用public static修饰。
5 内部类的编译
- 内部类:OuterClass.class、OuterClass$InnerClass.class...
- 局部内部类:OuterClass.class、OuterClass$NInnerClass.class...
- 匿名类:OuterClass.class、OuterClass$NInnerClass.class...
6 使用内部类
6.1 在外部类内部使用内部类
6.2 在外部类以外使用内部类
不能使用private修饰内部类,跟变量和方法的修饰符一个意思。
定义内部类变量:OuterClass.InnerClass varName,如果外部类有包名,加上包名;
6.2.1 使用非静态内部类
必须先创建外部类实例,才能创建内部类的实例。
OuterInstance.new InnerContructor();
public class InnerClassTest { public InnerClassTest(){} public class A{ public A(String a){ System.out.println(a); } } } class B extends InnerClassTest.A{ public B(InnerClassTest innerClassTest) { innerClassTest.super("hello"); } } class C{ InnerClassTest.A a = new InnerClassTest().new A("hello"); }
6.2.2 使用静态内部类
OuterClass.InnerClass var = new OuterClass.InnerClass(...);
7 局部内部类
- 不能用static和访问控制符修饰。
- 局部内部类和匿名内部类访问的局部变量默认是final修饰的,java 8以前必须显式使用final关键字修饰。
7.1 普通的
7.2 匿名内部类
- 必须实现一个类或一个接口
- 不能是抽象类,系统直接创建对象
- 不能定义构造器,没有类名。