一. 分类
静态内部类(类内部类) 成员内部类(实例内部类) 方法内部类 匿名内部类
二. 静态内部类
不能引用外部类的实例变量和实例方法 实例创建方式
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();
}