快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
LevelClass { static int staticField; int instanceField;    static class NestedTopLevelClass { static { System.out.println ("Can access staticField " + staticField); // System.out.println ("Cannot access instanceField " + instanceField); }    { System.out.println ("Can access staticField " + staticField); // System.out.println ("Cannot access instanceField " + instanceField); } } }

对Java嵌套类的讨论(6)

时间:2010-12-21

在上面NestedTopLevelClass类的类初始化和对象初始化代码块中,你可以访问TopLevelClass的staticField变量。不过你在这两个代码块中都不能访问instanceField变量。因为NestedTopLevelClass和任何的TopLevelClass对象都是无关的,所以NestedTopLevelClass 不能访问TopLevelClass的instanceField变量。

警告:一个嵌套顶级类不能访问任何外部类的实例成员(包括字段和方法)。

虽然NestedTopLevelClass不能访问TopLevelClass的实例字段,但是static的修饰符并不会妨碍NestedTopLevelClass声明自己的实例字段,以及创建NestedTopLevelClass对象。列表4的代码就是一个很好的例子:

Listing 4. NestedTopLevelClassDemo.java

// NestedTopLevelClassDemo.java    class TopLevelClass { static class NestedTopLevelClass { int myInstanceField;    NestedTopLevelClass (int i) { myInstanceField = i; } } }    class NestedTopLevelClassDemo { public static void main (String [] args) { TopLevelClass.NestedTopLevelClass ntlc; ntlc = new TopLevelClass.NestedTopLevelClass (5); System.out.println (ntlc.myInstanceField); } }

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

5

NestedTopLevelClassDemo的main()方法创建了一个NestedTopLevelClass变量--ntlc。声明该变量的语法和列表3的一样(Employee.JobIterator eji = e.getJobIterator ())。 通常,当你需要一个嵌套类的变量时,要在该嵌套类名的前面加入所有外部类的名字,并且用“.”将它们分开。用new关键字声明该嵌套类的时候也要这样做。

这时,你可能想知道你是否可以在一个嵌套顶级类中声明一个顶级嵌套类。还有,如果两个不同的外部类声明了同样的字段变量名,但该变量的类型或者初始化值是不同的?要解答这些问题,可看列表5:

Listing 5. NestingAndShadowingDemo.java

// NestingAndShadowingDemo.java    class TopLevelClass { private static int a = 1; private static int b = 3;    static class NestedTopLevelClass { private static int a = 2;    static class NestedNestedTopLevelClass { void printFields () { System.out.println ("a = " + a); System.out.println ("b = " + b); } } } }    class NestingAndShadowingDemo { public static void main (String [] args) { TopLevelClass.NestedTopLevelClass.NestedNestedTopLevelClass nntlc; nntlc = new TopLevelClass.NestedTopLevelClass. NestedNestedTopLevelClass (); nntlc.printFields (); } }

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

a = 2

b = 3

NestingAndShadowingDemo可以编译运行证明你可以在顶级嵌套类中嵌套顶级嵌套类。结果也显示了NestedTopLevelClass的一个字段屏蔽了TopLevelClass的字段。结果是打印出NestedTopLevelClass的字段内容。

使用嵌套顶级类,你不可以访问外部类的实例字段或者调用该类的实例方法。要访问实例成员,Java支持内部类。内部类和嵌套顶级类相似,不同的

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