Java内部类学习小结

来源:互联网 发布:淘宝搜索不到东西 编辑:程序博客网 时间:2024/05/17 05:15

一. 分类

  1. 静态内部类(类内部类)
  2. 成员内部类(实例内部类)
  3. 方法内部类
  4. 匿名内部类

二. 静态内部类

  1. 不能引用外部类的实例变量和实例方法
  2. 实例创建方式
public class OutStaticInner {    Inner inner = new Inner();    static class Inner {        OutStaticInner outStaticInner = new OutStaticInner();    }}class NewInner {    OutStaticInner.Inner inner = new OutStaticInner.Inner();}

三. 成员内部类

  1. 不能引用外部类的类变量和类方法
  2. 不能有类成员变量和方法,可以有常量。
    如果外部类的类方法m中或者类变量i的初始赋值,引用了内部类的类成员,那么在调用m或者初始化i时会导致内部类的初始化,此时外部类的实例可能还没有创建。而成员内部类是与其外部类实例绑定的,这显然互相矛盾。
  3. 成员内部类是闭包
  4. 实例创建方式
public class OutInstanceInner {    Inner inner = new Inner();    class Inner {        OutInstanceInner outInstanceInner = new OutInstanceInner();    }}class NewInsInner {    OutInstanceInner.Inner inner = new OutInstanceInner().new Inner();}

四. 方法内部类

  1. 不能引用外部类的类变量和类方法
  2. 不能有static的成员变量和方法,可以有常量。
  3. 可用修饰符和方法变量一致(final)
  4. 不能引用外围方法的局部变量,除非是final的变量。
    • 外围方法的生命周期和方法内部类不一致。
    • 方法内部类会将外围方法的局部变量在自己内部拷贝一份,如果值发生改变,会导致内外不一致的现象。
  5. 实例的创建方式,方法外部无法创建方法内部类的实例。
public class OutMethodInner {    void method() {        class Inner {            OutMethodInner outMethodInner = new OutMethodInner();        }        Inner inner = new Inner();    }}

五. 匿名内部类

  1. 根据匿名内部类所在位置决定其属性
  2. 分类
    • 继承式
    • 接口式
    • 参数式
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();}
0 0