为正确理解static在应用于内部类时的含义必须记住内部类的对象默认持有创建它的那个封装类的一个对象的句柄然而假如我们说一个内部类是static的这种说法却是不成立的static内部类意味着 () 为创建一个static内部类的对象我们不需要一个外部类对象 () 不能从static内部类的一个对象中访问一个外部类对象 但在存在一些限制由于static成员只能位于一个类的外部级别所以内部类不可拥有static数据或static内部类 倘若为了创建内部类的对象而不需要创建外部类的一个对象那么可将所有东西都设为static为了能正常工作同时也必须将内部类设为static如下所示 //: Parceljava // Static inner classes package cparcel; abstract class Contents { abstract public int value(); } interface Destination { String readLabel(); } public class Parcel { private static class PContents extends Contents { private int i = ; public int value() { return i; } } protected static class PDestination implements Destination { private String label; private PDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } public static Destination dest(String s) { return new PDestination(s); } public static Contents cont() { return new PContents(); } public static void main(String[] args) { Contents c = cont(); Destination d = dest(Tanzania); } } ///:~ 在main()中我们不需要Parcel的对象相反我们用常规的语法来选择一个static成员以便调用将句柄返回Contents和Destination的方法 通常我们不在一个接口里设置任何代码但static内部类可以成为接口的一部分由于类是静态的所以它不会违反接口的规则——static内部类只位于接口的命名空间内部 //: IInterfacejava // Static inner classes inside interfaces interface IInterface { static class Inner { int i j k; public Inner() {} void f() {} } } ///:~ 在本书早些时候我建议大家在每个类里都设置一个main()将其作为那个类的测试床使用这样做的一个缺点就是额外代码的数量太多若不愿如此可考虑用一个static内部类容纳自己的测试代码如下所示 //: TestBedjava // Putting test code in a static inner class class TestBed { TestBed() {} void f() { Systemoutprintln(f()); } public static class Tester { public static void main(String[] args) { TestBed t = new TestBed(); tf(); } } } ///:~ 这样便生成一个独立的名为TestBed$Tester的类(为运行程序请使用java TestBed$Tester命令)可将这个类用于测试但不需在自己的最终发行版本中包含它 |