虽然由一个匿名内部类创建一个对象时,你不可以建立构造器,但你可以使用一个对象初始块来来执行自定义的初始化。例如,如果你想定制anonymousinnerclassdemo匿名子类farmer中的farmer jane doe milks cows信息。你想将要挤的奶牛数目通过命令行传递过去,并且令该数值出现在信息中。由于一个对象初始块是在对象创建时执行的,你只要在对象初始化中执行相应的命令行参数初始化就可以了,如列表8所示:
listing 8. anonymousinnerclassdemo2.java
// anonymousinnerclassdemo2.java abstract class farmer farmer (string name) abstract void occupation (); class beeffarmer extends farmer void occupation () class anonymousinnerclassdemo2 new farmer ("jane doe") { void occupation () |
假设你在命令行中输入java anonymousinnerclassdemo2 10,你就会得到以下的输出:
farmer john doe raises beef cattle
farmer jane doe milks 10 cows
anonymousinnerclassdemo2仍然通过调用构造器farmer (string name)来初始化所得对象的farmer层。不过,所得对象的匿名层也有一个机会初始化,这就是通过对象初始代码块。
注意:虽然一个匿名内部类没有名字,编译器仍然需要为该class文件产生一个名字。编译器选择的是一个整数,该数字放在外部类和$符号的后面,作为匿名内部类的名字。例如,在anonymousinnerclassdemo2中,编译器为该匿名内部类产生的class文件名是anonymousinnerclassdemo2$1.class。
在结束这部分前,这里提及一下匿名内部类的实际应用:开发者经常使用匿名内部类来简化事件处理--即重要事件的通告,例如移动鼠标或者按一个按钮--在程序中会产生和显示一个图形用户界面(guis)。使用匿名内部类作事件处理是很方便的,因为这些处理通常都不需要一个类名。列表9就是这样一个例子,这里的匿名内部类简化了windows-closing的事件处理。
listing 9. anonymousinnerclassdemo3.java
// anonymousinnerclassdemo3.java import java.awt.*; class anonymousinnerclassdemo3 frame f = new frame ("anonymous inner class demo #3"); // add a window listener that will generate a window closing event f.addwindowlistener (new windowadapter () // establish the frame window's size as 300 horizontal pixels by f.setsize (300, 100); // display the frame window and get the underlying event handling f.setvisible (true); |
在运行时,anonymousinnerclassdemo3显示了一个矩形的窗口,即框架窗口,它是所得gui的主要窗口。在框架窗口出现后,用户可以移除该窗口并且停止anonymousinnerclassdemo3的执行。这通常在用户点击窗口右上角的x按钮时发生。
当用户按x时,底层的java windowing工具包创建了一个事件对象,并且调用一个特别的方法--windowclosing (windowevent e),e包含有该事件对象的一个引用--该方法放在一个被称为frame窗口的window监听者(window listener)对象中。该监听者对象通过调用frame的addwindowlistener (windowlistener wl)方法注册到底层的工具包中(因此工具包可以知道方法的位置)。
windowlistener 接口声明了几个方法,每个方法都用作一个可能的window事件。开发者不必实现全部这些方法,因为java的windowing工具包的设计者建立了一个windowadapter类,它实现了全部的windowlistener方法。不过都是空的方法体,开发者可以声明一个匿名内部类来扩展windowadapter,并且实现其中的一个或者多个方法。如上所示,我选择覆盖windowclosing (windowevent e)方法,并且在其中调用system.exit (0);这样可以通过windowing工具包调用windowclosing (windowevent e),就可以终止一个程序(同时关闭窗口)。
注意:在为你的gui开发事件处理时,你将会经常用到匿名内部类。在以后的文章中,我将会提供许多由匿名内部类来进行事件处理的例子。
总结
这篇文章介绍了类嵌套对于java语言是很有用的。类嵌套不但令源代码变得清晰--因为你可以在类要管理的对象附近声明类--它同样可以减少一个源文件中,在同一级中声明类的名字的冲突机会。
有4种不同的嵌套类:nested top-level classes(嵌套顶级类), instance inner classes(实例内部类), local inner classes(本地内部类)和anonymous inner classes(匿名内部类)。嵌套顶级类只可以访问外部类的类级字段和调用类级的方法,而实例内部类可以访问外部类的类级和实例字段,并且调用一个外部类的类级或者实例方法。嵌套顶级类和实例内部类只可以出现在其它类的定义中,java还提供了本地内部类,可以出现在任意的代码块中--包括一个方法块或者一个if语句的代码块。由于一些本地内部类很短,因此可以不使用名字,java提供了匿名内部类。本地和匿名内部类可以访问外部代码块中本地的变量和参数,但要注意的是这些本地变量和参数必须是标识为final的。
| 上一页 1 2 3 4 5 6 7 8 |
| 相关内容:设计 操作系统 windows perl os |
| 【收藏此页】【大 中 小】【打印】【关闭】 | |
| 上一篇:对《java与模式》中工厂方法模式的异议 下一篇:分布式编程模式中的租约、事务和分布式事件机制 10万个软件免费高速下载 | |
| ||||||||||||||
|
|
-
关于我们
公司介绍 最新动态 联系我们 -
产品与服务
域名注册 jsp空间 php空间 -
常见问题
空间操作手册 网站备案相关 退款相关问题 -
技术支持
技术 QQ :178966803 联系电话:13616026886 联系邮箱:fjjsp@vip.163.com
扫描关注微信公众号
闽公网安备 35060202000074号