一. 分类
- 静态内部类(类内部类)
- 成员内部类(实例内部类)
- 方法内部类
- 匿名内部类
二. 静态内部类
- 不能引用外部类的实例变量和实例方法
- 实例创建方式
public class OutStaticInner {
Inner inner = new Inner();
static class Inner {
OutStaticInner outStaticInner = new OutStaticInner();
}
}
class NewInner {
OutStaticInner.Inner inner = new OutStaticInner.Inner();
}
三. 成员内部类
- 不能引用外部类的类变量和类方法
- 不能有类成员变量和方法,可以有常量。
如果外部类的类方法m中或者类变量i的初始赋值,引用了内部类的类成员,那么在调用m或者初始化i时会导致内部类的初始化,此时外部类的实例可能还没有创建。而成员内部类是与其外部类实例绑定的,这显然互相矛盾。 - 成员内部类是闭包
- 实例创建方式
public class OutInstanceInner {
Inner inner = new Inner();
class Inner {
OutInstanceInner outInstanceInner = new OutInstanceInner();
}
}
class NewInsInner {
OutInstanceInner.Inner inner = new OutInstanceInner().new Inner();
}
四. 方法内部类
- 不能引用外部类的类变量和类方法
- 不能有static的成员变量和方法,可以有常量。
- 可用修饰符和方法变量一致(final)
- 不能引用外围方法的局部变量,除非是final的变量。
- 外围方法的生命周期和方法内部类不一致。
- 方法内部类会将外围方法的局部变量在自己内部拷贝一份,如果值发生改变,会导致内外不一致的现象。
- 实例的创建方式,方法外部无法创建方法内部类的实例。
public class OutMethodInner {
void method() {
class Inner {
OutMethodInner outMethodInner = new OutMethodInner();
}
Inner inner = new Inner();
}
}
五. 匿名内部类
- 根据匿名内部类所在位置决定其属性
- 分类
public class AnonymousInner {
static void run(Interface face) {
face.method();
}
public static void main(String[] args) {
new Inherit() {
@Override
void method() {
System.out.println("inherit method.");
}
}.method();
new Interface() {
@Override
public void method() {
System.out.println("implement method.");
}
}.method();
run(new Interface() {
@Override
public void method() {
System.out.println("parameter method.");
}
});
}
}
class Inherit {
void method() {
System.out.println("method.");
}
}
interface Interface {
void method();
}