快速业务通道

对Java嵌套类的讨论 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

在运行后, LocalInnerClassDemo产生以下的输出:

Ada

Algol

APL

Assembly - IBM 360

Assembly - Intel

Assembly - Mostek

Assembly - Motorola

Assembly - VAX

Assembly - Zilog

BASIC

C

C++

Cobol

Forth

Fortran

Java

LISP

Logo

Modula 2

Pascal

Perl

Prolog

Snobol

LocalInnerClassDemo展示了在LocalInnerClassDemo的enumerator()类方法中声明本地内部类LocalInnerClass。要注意到enumerator()返回一个对象的引用,该对象的类实现了Enumeration接口(在java.util包中)。由于LocalInnerClass也实现了Enumeration,所以enumerator() 合法地返回一个到LocalInnerClass对象的引用。

enumerator()的参数列表中是一个单维数组object[],还有一个关键字final。final关键字的作用是什么?如果一个本地内部类企图访问一个本地变量或者是该类所处方法的一个参数,这些本地变量/参数必须是final的。两个不同的对象不能共享访问同样的非final变量或者参数,否则在设计上就会带来复杂的同步问题。使用final的本地/参数变量就没有这些困难。

注意:如果本地变量或者参数中有原始类型的变量,而不是引用的类型,编译器就用一个常数代替该变量。

在enumerator() 返回后,LocalInnerClassDemo可以访问该数组吗?对于一个参数来说(final或者其它的),会否在一个方法退出后消失呢?是的,该参数消失了;不过,如果你查看一下相应class文件的字节代码,你将会发现编译器产生了一些代码。首先,编译器在LocalInnerClass中创建了一个LocalInnerClass(Object val$array)构造器。第二,编译器创建了一个隐含的对象val$array;该字段在LocalInnerClass中。该字段被称为是一个synthetic字段 ,因为它是由编译器创建的。最后,该编译器返回new LocalInnerClass ();在enumerator()中,返回new LocalInnerClass (array);由于LocalInnerClass拥有指向同一个Object []数组(也就是传送到enumerator()的数组)的引用拷贝。所以在enumerator()的数组参数消失后,LocalInnerClass的方法仍然可以引用该数组。

提示:要知道更多的编译器是如何管理顶级类中本地内部类,可以学习以下内部类规范的文档,也可以通过javap程序来反解class文件。

匿名内部类(Anonymous inner classes)

如果一个类很短,你可以声明一个没有名字的本地内部类。因为它的名字对该类没有用处,而且,当同一个类中包含有几个本地内部类时,如果不选择一个名字,可以减少名字冲突的机会。没有名字的本地内部类就是匿名类部类。

对Java嵌套类的讨论(9)

时间:2010-12-21

由于匿名内部类没有一个名字,因此你声明的时候就要创建它,如列表7所示:

Listing 7. AnonymousInnerClassDemo1.java

// AnonymousInnerClassDemo1.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 AnonymousInnerClassDemo1 { public static void main (String [] args) { BeefFarmer bf = new BeefFarmer ("John Doe"); bf.occupation ();    new Farmer ("Jane Doe") { void occupation () { System.out.println ("Farmer " + name + " milks cows"); } }.occupation (); } }

在运行时,AnonymousInnerClassDemo1产生以下的输出:

Farmer John Doe raises beef cattle

Farmer Jane Doe milks cows

AnonymousInnerClassDemo1声

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号