★08.内部类

2017-07-03  本文已影响0人  iDragonfly
  1. 如果要从外部类的成员方法之外访问内部类,需要用outer.inner的方式引用。
  2. 内部类引用自己的方式是this,引用外部类的方式是outer.this。
  3. 内部类可以引用外部类的成员,要引用其他外部对象的时候,此对象必须是final的。
  4. 可以用.new来让某个外部类对象去创建其内部类对象。如:Outer.Inner inner = outer.new Inner();,不能跳过外部类对象直接创建内部类对象。
  5. 匿名内部类:
public class A {
    private class AA { }
    public AA getAA() {
        // 创建一个匿名内部类,此类继承AA
        return  new AA() {
            private  int ii = 0;
        };
    }
}
  1. 匿名内部类想要有构造函数的话,可以把代码放在构造代码块。
  2. 内部类(Inner Class):在方法作用域或类作用域中的类,可以定义在任何作用域中。若为匿名的,则为匿名内部类。
  3. 嵌套类(Nested Class):即static的内部类,嵌套类不能访问外围类的对象。
  4. 内部类与嵌套类的区别:内部类的保留了外围类的引用,可以访问外围类的对象。嵌套类则相反。
  5. 嵌套类不保留外围类的引用,所以不能用outer.inner的方式引用,也不能用使用.new的方式创建。
  6. 在接口中的类也是嵌套类,尽管没有static修饰(自动static)。
  7. java不能多重继承,只能单继承,但是可以其他要继承的类作为Java的内部类来间接实现。
  8. 继承别的外围类的内部类:
class WithInner {
    class Inner {}
}
// 继承外围类的内部类
public class InheritInner extends WithInner.Inner {
    InheritInner(WithInner wi) {
        wi.super();
    }
}
  1. 局部内部类(方法内)与匿名内部类的区别是:
  2. 局部内部类有名字能创建多个对象。
  3. 局部内部类有名字能有多个构造器。
  4. 匿名内部类只能用构造代码块来构造。
public class A {
    Counter getCounter(final String name) {
        // 局部内部类可以使用构造器来构造
        class LocalCounter implements Counter {
            private LocalCounter() {
                System.out.print("LocalCounter()");
            }
        }
        return new LocalCounter();
    }

    Counter getCounter2(final String name) {
        // 匿名内部类只能用构造代码块构造
        return new Counter() {
            {
                System.out.print("Counter()");
            }
        };
    }
}
上一篇 下一篇

猜你喜欢

热点阅读