a.成员内部类(Inner Class)
1.不能单独存在,必须依附于外部类。
2.Outer.Inner inner = outer.new Inner();
3.内部类可以访问当前外部类的private属性和方法,可以用”外部类名.this“访问外部实例的属性和方法。
4.this在内部类中代表内部类的对象(就近原则),使用外部类需要创建外部类对象。
b.匿名内部类(Anonymous Class)(最常用)
1.创建的是实现类或者子类的对象。
2.Runnable本身是接口,接口不能实例化,所以这里直接定义一个实现Runnable接口的匿名内部类,重写并实现run()方法,并且通过new直接实例化,然后转型为Runnable。定义匿名内部类时必须实例化它。写法:Runnable r = new Runnable() { // 实现必要的抽象方法 };
Main2.java编译成class文件后
c.静态内部类(Static Nested Class)
1.static修饰,不在依附于外部类实例,是一个完全独立的类。
2.Inner inner = new Inner(); 或者 Outer.Inner inner = new Outer.Inner();
3.可以访问当前外部类的private静态属性和静态方法。
d.总结
1.成员内部类和匿名内部类本质是相同的,都必须依附于外部类,隐含的持有Outer.this实例,并且拥有外部类的private访问权限。
2.静态内部类是独立类,但拥有外部类的private访问权限。