【初学者常见问题】从外到内,从内到外(内部类剖析2)

【初学者常见问题】从外到内,从内到外(内部类剖析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

◆内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。

◆在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。

◆创建内部类对象的时刻并不依赖于外围类对象的创建

◆内部类是一个独立的实体,和组合不是同一个概念


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值