初学Java,闭包和回调(二十一)

news/2024/7/4 1:40:13 标签: java, string, class, javascript, interface
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

闭包在Javascript中用的比较多,Java不显式支持闭包,但对于非静态内部类而言,它记录了其外部类的详细信息,还保留了一个创建非静态内部类对象的引用,并且可以直接调用外部类的private成员,因此可以把非静态内部类当成面向对象领域的闭包。通过这种仿闭包的非静态内部类,可以很方便的实现回调,回调就是允许客户类通过内部类引用来调用其外部类的方法。

假设有一个人,是一个程序员,又是一个IT培训师。也应是说需要定义一个特殊的类,既需要实现IT培训师的接口,也需要继承程序员父类,接口和父类都包含相同的work方法,需要在一个类中的work方法中,既包括接口的work,和父类的work.这个时候可以通过一个仿闭包的内部类实现这个功能

class="language-class="tags" href="/tags/JAVA.html" title=java>java">public interface Teachable
{
	void work();
}  

class="language-class="tags" href="/tags/JAVA.html" title=java>java">public class Programmer 
{
	private String name;
	public Programmer(){}
	public Programmer(String name)
	{
		this.name = name;
	}
	public String getName()
	{
		return this.name;
	}
	public void work()
	{
		System.out.println(name + "在灯下敲键盘...");
	}
}

class="language-class="tags" href="/tags/JAVA.html" title=java>java">public class TeachableProgrammer extends Programmer 
{
	public TeachableProgrammer(){}
	public TeachableProgrammer(String name)
	{
		super(name);
	}
	private void teach()
	{
		System.out.println(getName() + "在讲台上培训讲解...");
	}
	private class Closure implements Teachable
	{
		/*
		非静态内部类回调外部类实现work方法,非静态内部类引用的作用
		仅仅是向客户类提供一个回调外部类的途径
		*/
		public void work()
		{
			teach();
		}
	}
	//返回一个非静态内部类的引用,允许外部类通过该非静态内部类引用来回调外部类的方法
	public Teachable getCallbackReference()
	{
		return new Closure();
	}
}

class="language-class="tags" href="/tags/JAVA.html" title=java>java">public class TestTeachableProgrammer 
{
	public static void main(String[] args) 
	{
		TeachableProgrammer tp = new TeachableProgrammer("某某");
		//直接调用TeachableProgrammer类从Programmer类继承到的work方法
		tp.work();
		//表面上调用的是Closure的work方法,实际上是回调TeachableProgrammer的teach方法
		tp.getCallbackReference().work();
	}
}



http://www.niftyadmin.cn/n/1411528.html

相关文章

ABBYY PDF Transformer+安装教程

ABBYY PDF Transformer是一个新的全功能PDF文档工具,涵盖整个文档生命周期所涉及的各项功能,包括创建、讨论、批准、保护、转换成可编辑格式的PDF文件、文件合并、文本和图像的提取等。本文小编将给大家讲解ABBYY PDF Transformer安装教程,一…

初学Java,枚举类(二十二)

Java的枚举类比C#枚举类更像类一点,因为它还可以定义属性和方法public enum Gender {MALE,FEMALE;private String name;public void setName(String name){switch(this){case MALE:if(name.equals("男")){this.name name;}else{System.out.println("参数错误&…

转 VB ListView控件各种操作详解

Private Sub Form_Load()ListView1.ListItems.Clear 清空列表ListView1.ColumnHeaders.Clear 清空列表头ListView1.View lvwReport 设置列表显示方式ListView1.GridLines True 显示网络线ListView1.LabelEdit lvwManual …

vue+elementui实现联想购物商城,样式美观大方

目录 一、首页效果图对比 1.联想商城首页截图: 2.作者项目效果图: 二、商品详情效果图对比 1.联想官方截图: 2.作者项目截图: 三、项目实现 1.数据分离维护 2.首页推荐列表数据处理 3.商品详情数据动态获取完成交互 4.商品详…

初学Java,对象的软,弱和虚引用(二十三)

java.lang.ref包下提供了三个类SoftReference,phantomReference WeakReference,分别代表软引用,虚引用和弱引用 C#中没有这些概念 强引用,最常见的引用,程序创建一个对象,并把这个对象赋值给一个引用变量,通过该引用来…

WMI使用小工具——WMI代码生成器(转)

说明:WMI Code Creator是微软提供的一个WMI代码生成工具,这个工具是微软在2005年5月提供的,微软对这个软件提供的说明如下: This code is not supported under any Microsoft standard support program or service. This code is …

angular ui-router,最适合的angular1的路由开发

1、引入&#xff08;cdn地址&#xff09; <script src"http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular.min.js"></script><script src"https://cdn.bootcss.com/angular-ui-router/1.0.3/angular-ui-router.js"></scr…

初学Java,jar命令详解(二十四)

JAR文件是个压缩包&#xff0c;其实就是一个类库&#xff0c;相当于.net世界里面的dll&#xff0c;里面放的都是编译编码后生成的字节码文件(xxx.class)&#xff0c;另外会有一个清单文件META-INF/MANIFEST.MF 其文件也是可以数字签名的&#xff0c;所谓增强安全性罗。 下面罗列…