Java内部类提供的闭包功能,比指针更灵活更安全

Java内部类提供的闭包功能,比指针更灵活更安全 

package cm.java.Practic10;

interface Incrementable {
	void 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 operation");
	}

	static void f(MyIncrement mi) {
		mi.increment();
	}
}

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 getCallbackReference() {
		return new Closure();
	}
}

class Caller {
	private Incrementable callbackReference;

	Caller(Incrementable cbh) {
		callbackReference = cbh;
	}

	void go() {
		callbackReference.increment();
	}
}

public class CallbacksP206 {

	public static void main(String[] args) {
		
		Callee1 c1 = new Callee1();
		Callee2 c2 = new Callee2();
		MyIncrement.f(c2);
		Caller caller1 = new Caller(c1);
		Caller caller2 = new Caller(c2.getCallbackReference());
		caller1.go();
		caller1.go();
		caller2.go();
		caller2.go();
	}
}

/*
内部类提供的闭包功能,比指针更灵活更安全 
 
*/

输出:

other operation
1
1
2
other operation
2
other operation
3


过程:

Callee1 c1 = new Callee1();
		Callee2 c2 = new Callee2();
		MyIncrement.f(c2);
先分别实例化两个Callee,为c1,c2;

然后调用MyIncrement.f(c2);

即:

class MyIncrement {
	public void increment() {
		System.out.println("other operation");
	}

	static void f(MyIncrement mi) {
		mi.increment();
	}
}

首先执行:

static void f(MyIncrement mi) {
mi.increment();
}

即c2.increment();,进入到class Callee2调用increment();

执行该方法:

public void increment() {
		super.increment();
		i++;
		System.out.println(i);
	}

首先调用super.increment();

输出:
other operation

1


接着:

Caller caller1 = new Caller(c1);
		Caller caller2 = new Caller(c2.getCallbackReference());
其中Caller caller2 = new Caller(c2.getCallbackReference());
相当于,new Closure()来实例化Caller;


caller1.go();
		caller1.go();
相当于调用callbackReference.increment();这里 callbackReference=c1;

所以,相当于调用Callee1中的increment2次,i初始化为0;

class Callee1 implements Incrementable {

	private int i = 0;

	public void increment() {
		i++;
		System.out.println(i);
	}
}
所以输出:

1
2


接着:

caller2.go();
		caller2.go();
相当于调用 callbackReference.increment();这里 callbackReference为c2中的new Closure();;
所以调用class Callee2中class Closure中的 increment();

private class Closure implements Incrementable {
		public void increment() {
			Callee2.this.increment();
		}
	}
相当于调用Callee2.this.increment();

public void increment() {
		super.increment();
		i++;
		System.out.println(i);
	}

刚才i已经为1

所以输出:

other operation
2
other operation
3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值