
/**//*引用外围类对象:在外围类名称后面跟一个句点和this关键字来实现.eg:在类Sequence.SSelector中,通过Sequence.this,内部类任何方法都能获取那个指向外围类Sequence的被保存的引用.
*对象要想生成其自身内的内部类的对象,必须在new中提供一个引用,指向那个外围类对象.eg:Contents con = parcel.new Contents();等效于Contents con = parcel.getContents();
*创建内部类对象,不能想当然地认为只需加上外围类Parcel的名字就ok了,而是必须使用此外围类的对象来创建其内部类的对象.这是因为此内部类的对象会消消地连接到创建它的外围类的对象(当然嵌套类例外).
*/

/**//*为什么需要内部类?
*内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类对象.所以可以认为内部类提供了某种进入其外围类的窗口.
*用外围类实现某个接口不是总能享用到接口带来的方便(否则内部类就没有必要存在了),所以内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响.
*内部类提供了继承多个类(非abstract的或abstract的)的能力(内部类允许继承多个非接口类型),所以说内部类使得多重继承的解决方案更加完整(外围类只能继承多个接口和一个超类).
*
*对于多个接口:当遇到问题的时候,通常问题本身就能给出某些指引,告诉你是应该使用单一类还是内部类;
*对于多个基类:只能使用内部类才能实现多重继承.
*/

/**//*闭包与回调
*闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外围类对象的引用,在此作用域内,内部类有权操作所有成员(包括private成员).
*回调(callback):通过回调,对象能够携带一些信息,这些信息允许它在稍后的某个时刻调用初始的对象.
*通过内部类提供闭包的功能是完美的解决方案.
*/
interface MyIncrement1...{void increment();}
class MyIncrement2...{
void increment()...{System.out.println("class MyIncrement's operation: increment()");}
static void f(MyIncrement2 mi)...{mi.increment();}
}

class callee1 implements MyIncrement1...{
private int i;
public void increment()...{
System.out.println("callee1:interface MyIncrement1's operation: increment() " + (i++));
}
}
class callee2 extends MyIncrement2...{
private int i;
private void incr()...{System.out.println("callee2:interface MyIncrement1's operation: increment() " + (i++));}
private class closure implements MyIncrement1...{
public void increment()...{incr();}
}
public MyIncrement1 getCallbackReference()...{return new closure();}
}
class caller...{
private MyIncrement1 callbackReference;
caller(MyIncrement1 mi)...{callbackReference = mi;}
void go()...{callbackReference.increment();}
}
class Callbacks...{
public static void main(String[] args) ...{
callee1 c1 = new callee1();
callee2 c2 = new callee2();
MyIncrement2.f(c2);
caller caller1 = new caller(c1);
caller caller2 = new caller(c2.getCallbackReference());
caller1.go();
caller2.go();
caller1.go();
caller2.go();
}
}

/**//*上例进一步揭示了外围类实现一个接口和内部类实现此接口的区别.callee1是简单的继承接口,callee2继承自MyIncrement2,而类MyIncrement2已经有了一个increment()方法,并且与MyIncrement1接口中的increment()方法完全不相关.
*所以如果callee2继承了MyIncrement2,就不能为了MyIncrement1的用途而覆盖MyIncrement2的increment()方法.于是只能使用内部类独立地实现MyIncrement1.
*在callee2中除了getCallbackReference()以外,其他成员都是private的.要想建立与外部世界的任何连接,接口MyIncrement1是必需的.
*内部类Closure实现了MyIncrement1,以提供一个返回callee2的"钩子"(而且是个安全的钩子).无论谁获得此MyIncrement1的引用,都只能调用increment()方法,除此之外没有其他功能.
*caller构造器需要一个MyIncrement1的引用作为参数,然后在以后的某个时刻,caller对象可以使用此引用回调callee类.
*回调的价值在于它的灵活性,可以在运行时动态地决定需要调用什么方法.
*/
2549

被折叠的 条评论
为什么被折叠?



