`
wangqisen
  • 浏览: 47114 次
文章分类
社区版块
存档分类
最新评论

java编程思想笔记--内部类部分八

 
阅读更多

使用内部类实现回调过程的呈现如下代码。回调在java GUI的设计中处处皆是。

另外重复一条容易被忽视的设计规则,在子类继承父类,并对父类的方法进行重写时,不能降低父类方法的访问权限,可以扩大(当然,这样毫无意义),但是不能缩小,这是出于子类不能改变父类成员属性的考虑。例如,如果父类的方法访问权限是public,那么子类覆盖后的该方法访问权限就不能是protected或者private。

代码:

package test;
interface Increment{
	void increment();
}
class MyIncrement{
	public void increment(){
		System.out.println("Other operation");
	}
	static void f(MyIncrement mi){
		mi.increment();
	}
}
class Caller extends MyIncrement{
	private int i=0;
	public void increment(){
		super.increment();
		i++;
		System.out.println(i);
	}
	private class Closure implements Increment{

		@Override
		public void increment() {
			// TODO Auto-generated method stub
			Caller.this.increment();
		}
	} 
	Increment getCallbackReference(){
		return new Closure();
	}
}
class Caller2{
	private Increment callbackReference;
	Caller2(Increment callbackReference){
		this.callbackReference=callbackReference;
	}
	void go(){
		callbackReference.increment();
	}
}
public class p206 {
	public static void main(String args[]){
		Caller callera=new Caller();
		Caller2 callerb=new Caller2(callera.getCallbackReference());
		callerb.go();
	}
}

其中的Closure其实就是用来提供回调功能的内部类。相比于西加加用指针来实现回调来说,java这种方式更加的安全,不会因为指针的错误操作导致出错。可以看出,Closure是private的,只能通过getCallbackReference函数来获得,这样就比较安全。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics