服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

对java嵌套类的讨论

ad_qqread_mid_big">

  虽然由一个匿名内部类创建一个对象时,你不可以建立构造器,但你可以使用一个对象初始块来来执行自定义的初始化。例如,如果你想定制anonymousinnerclassdemo匿名子类farmer中的farmer jane doe milks cows信息。你想将要挤的奶牛数目通过命令行传递过去,并且令该数值出现在信息中。由于一个对象初始块是在对象创建时执行的,你只要在对象初始化中执行相应的命令行参数初始化就可以了,如列表8所示:

  listing 8. anonymousinnerclassdemo2.java

// anonymousinnerclassdemo2.java

abstract class farmer
{
protected string name;

farmer (string name)
{
this.name = name;
}

abstract void occupation ();
}

class beeffarmer extends farmer
{
beeffarmer (string name)
{
super (name);
}

void occupation ()
{
system.out.println ("farmer " + name + " raises beef cattle");
}
}

class anonymousinnerclassdemo2
{
public static void main (final string [] args)
{
beeffarmer bf = new beeffarmer ("john doe");
bf.occupation ();

new farmer ("jane doe")
{
private string count;

{
if (args.length == 1)
count = args [0];
}

void occupation ()
{
if (count == null)
system.out.println ("farmer " + name + " milks cows");
else
system.out.println ("farmer " + name + " milks " +
count + " cows");
}
}.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.*;
import java.awt.event.*;

class anonymousinnerclassdemo3
{
public static void main (string [] args)
{
// create a rectangular frame window with a title bar at the top.

frame f = new frame ("anonymous inner class demo #3");

// add a window listener that will generate a window closing event
// in response to user attempts to click the little x button (on
// windows platforms) to the right of the title bar. when the user
// clicks that button, the window closing event results in a call
// to a method named windowclosing(). by calling system.exit (0);
// from within that method, the application exits.

f.addwindowlistener (new windowadapter ()
{
public void windowclosing (windowevent e)
{
system.exit (0);
}
});

// establish the frame window's size as 300 horizontal pixels by
// 100 vertical pixels.

f.setsize (300, 100);

// display the frame window and get the underlying event handling
// system running.

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的。

>>>更多专题请看java的类专题
上一页 1 2 3 4 5 6 7 8 
相关内容:设计  操作系统  windows  perl  os  
【收藏此页】【大 中 小】【打印】【关闭】
上一篇:对《java与模式》中工厂方法模式的异议
下一篇:分布式编程模式中的租约、事务和分布式事件机制


10万个软件免费高速下载
教育教学 安全相关 游戏娱乐 源码下载 编程开发 数码软件 其它类别
网络软件 联络聊天 系统工具 媒体工具 图形图像 应用软件 行业软件
·java: jni完全手册
·java reflection (java反射)详解
·java连接数据库谈
·深入java字节码加密
·java虚拟机类装载:原理、实现与应用
·java反编译的研究
·jsp与java mail api
·让界面更加绚丽 java se 6.0 gui体验
·为什么是java ee 5
·使用java 输出/输出流读写数据
 
·接口和抽象类的定义方式举例说明
·用maven制作java项目发行包
·java 基础入门 pom.xml 元素描述
·用jbuilder2007开发扩展jsf标签的插
·抽象类对象类和对象包装类
·使用java实现在文件中添加字符串
·instanceof和回调概念
·java变量的赋值与传递
·java se6调用java编译器的两种新方法
·weblogic运用db的java控件访问数据库

扫描关注微信公众号