给java的内部类和接口整的晕乎乎的,花了大量时间总算有点明白了。今天先整理下java的内部类。
把一个类的定义放在另一个类内部就构成了内部类。内部类有很多好处,它能直接使用外部类对象的所有成员,而不需要任何特殊条件。 那他是如何调用的呢?这就是编译器的工作了,编译器会为内部类生成默认的构造器,并传递外部类的对象引用,如果内部类已有构造函数,会为该构造函数的参数列表增加一项用于传递外部类的对象引用。内部类可以通过outclassname.this的语法生成对外部类对象的引用。还可通过外部类对象+.new创建一个内部类,如outclassname.innerclassname parms = 外部类对象名.new innerclassname(); 切记,内部类对象一定是被外部类的对象创建的。在拥有外部类对象之前不可能有内部类对象,因为每个内部类对象都有个指向外部类对象的引用,显然外部类对象先与内部类对象。还有个例外,如果你创建的是静态内部类,或称嵌套类,那么它就不需要对外部类对象的引用。
在方法和作用域内的内部类。记住一点,超过了方法的作用域后,该内部类就不起作用了。
匿名内部类。即没有名字的内部类。语法为 new classname{};不要忘记左后的分号,因为花括号是匿名类的,而new连着后面的是一条语句,必须加上分号。定义一个匿名内部类时,假如希望它使用一个在其外部定义的对象,则该对象必须为final类型的。看一段代码













这段代码是能编译成功的,但是上面不是说i必须要final类型吗?这里的i传递给了外部类的构造函数,并没有为匿名内部类使用,所以无需定义final类型。 还有关于匿名内部类的构造器问题,它是没有名字的,构造器的功能是通过实例初始化实现的。匿名内部类可以大大简化工厂模式的设计方法,这点在下次的接口中介绍。
接口内部的类。嵌套类可以作为接口的内部类。放在接口中的类被自动设为static和public类型。
闭包与回调的问题。闭包:是一个可调用的对象,记录一些信息,这些信息来自于创建它的作用域。很显然,跟内部类的定义非常像。回调:对象携带一些信息,允许在稍后某个时刻调用初始对象。
内部类的继承。由于内部类有一个指向外围类对象的秘密引用,所以在继承内部类的时候,该秘密引用必须被初始化。解决方法是enclosingClassReference.super();语法,看一下代码:

















这里的enclosingClassReference.super();语法非常不好理解。可以这么想,这里的super指的就是AnoClass类的超类即基类,前面降到过的对外部类的引用语法是outerclassname.this,而这个构造器里的wi.super就是指的是基类的对外部类的引用。wi即outerclassname,而super()是AnoClass的基类,就是Inner的this,两个一连,就是前面提到的对外部类的引用。 Inner的构造器没有任何参数,可是AnoClass的构造器为什么有个参数呢?前面提到的,编译器会为内部类构造器自动生成一个对外部类的引用。如果基类构造器中不止一个参数,则如下代码:


















如果基类构造器中另外有个形参,则在super里也必须带上一个实参,因为super是在基类的引用。