快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
明了一个抽象的Farmer类,里面封装了一个farmer的名字和职业---通过一个抽象的occupation()方法。BeefFarmer类扩展Farmer,并且覆盖了occupation()来标识beef farmer的工作。该类出现在AnonymousInnerClassDemo1的main()方法中,它创建了一个BeefFarmer对象并且调用它的occupation()方法来打印出该beef farmer的工作。这里并没有什么奇怪的地方!不过当你继续查看main()方法时,你会看到一些奇怪的东西:new Farmer ("Jane Doe") { ... }。它看来要由抽象的Farmer类中创建一个对象,这看来是一件不可能的事。不过在("Jane Doe") 下面的大括号又是什么意思呢?看来这不是合法的Java代码?实际上,这些代码是合法的,它的含义是:让JVM由Farmer匿名子类中创建一个对象。该子类覆盖了Farmer的occupation()方法,并且调用Farmer (String name)的构造器来初始化Farmer的protected字段name。在创建该对象后,调用它的occupation()方法并且丢弃该对象的引用,以便令该对象符合垃圾收集的条件。

AnonymousInnerClassDemo1使用超类的构造器来做初始化,这样就带来一个问题:我可以在一个匿名类中声明自己的构造器吗?答案是不可以。由于一个构造器需要一个类名,而匿名类是没有名字的,所以编译器不能选择一个名字。

对Java嵌套类的讨论(10)

时间:2010-12-21

警告:在一个匿名类中声明构造器是非法的,这是由于构造器的名字要和所处的类名一样,而匿名内部类是没有名字的。

虽然由一个匿名内部类创建一个对象时,你不可以建立构造器,但你可以使用一个对象初始块来来执行自定义的初始化。例如,如果你想定制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中,编译

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号