【初学者常见问题】从外到内,从内到外(内部类剖析1) http://blog.csdn.net/pearyangyang/article/details/17280403
上一篇文章测试了静态内部类和非静态内部类的区别,下面将站在功能的角度上来挖掘内部类的潜能。
Java语法机制声明一个外部类是不能多重继承的。而内部类则填补了这个空白。
引用(Thinking In Java):
每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
下面引入一个例子:
interface Incrementable{
void increment();
}
//Callee1实现了Incrementable接口,重写了increment()方法
class Callee1 implements Incrementable{
private int i = 0;
public void increment(){
i++;
System.out.println(i);
}
}
class MyIncrement{
public void increment(){
System.out.println("Other opertion");
}
static void f(MyIncrement mi){
mi.increment();
}
}
//Callee2继承了MyIncrement类,重写了它的incement()方法
class Callee2 extends MyIncrement{
private int i = 0;
public void increment(){
super.increment();
i++;
System.out.println(i);
}
private class Closure implements Incrementable{
public void increment(){
Callee2.this.increment();
}
}
//方法实例化了一个Incrementable(也可以称为是Closure)
Incrementable getCallBackReference(){
return new Closure();
}
}
class Caller{
private Incrementable callbackReference;
Caller(Incrementable cbh){
callbackReference = cbh;
}
void go(){
callbackReference.increment();
}
}
public class CallBacks{
public static void main(String args[]){
Callee1 c1 = new Callee1(); //实现了Incrementable接口的c1
Callee2 c2 = new Callee2(); //继承了MyIncrement类的c2
//MyIncrement调用了他的静态方法f(MyIncrement mi),c2调用了他的increment()方法,
//super.increment()输出"Other operation",然后再System.out.println(i)输出i是1
MyIncrement.f(c2);
//实例化Caller
Caller caller1 = new Caller(c1);
//c2.getCallBackReference()也是返回的一个Closure对象
Caller caller2 = new Caller(c2.getCallBackReference());
caller1.go();//这里就相当于Caller1的对象调用increment()方法,输出1
caller1.go();//i自加,输出2
//这里就相当于Closure对象调用increment()方法,
//方法Callee2.this.increment()实际又回到了外部类Callee2的increment()方法
//super.increment()输出other operation(),
//第二步执行i++【i在MyIncrement.f(c2)方法执行后就变成1了】,所以这次再自加输出2
caller2.go();
//这个步骤同上
caller2.go();
}
}
外部类Callee1实现了Incrementable接口,而Callee2继承了MyIncrement类,并且重写了increment()方法,但是如果还想实现Incrementable接口的时候,方法就不允许了,于是要想实现其相应的功能可以引入内部类来继承Incrementable接口,这样它也能得到相应的功能特性。这也是内部类给我最深刻的作用。
另外内部类还有以下pla pla的特性:——Thinking In Java
◆内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。
◆在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。
◆创建内部类对象的时刻并不依赖于外围类对象的创建
◆内部类是一个独立的实体,和组合不是同一个概念