java的static内部类
为正确领略static在应用于内部类时的寄义,必需记着内部类的工具默认持有建设它的谁人封装类的一个工具的句柄。然而,如果我们说一个内部类是static的,这种说法却是不创立的。static内部类意味着:
(1) 为建设一个static内部类的工具,我们不需要一个外部类工具。
(2) 不能从static内部类的一个工具中会见一个外部类工具。
但在存在一些限制:由于static成员只能位于一个类的外部级别,所以内部类不行拥有static数据或static内部类。
倘若为了建设内部类的工具而不需要建设外部类的一个工具,那么可将所有对象都设为static。为了能正常事情,同时也必需将内部类设为static。如下所示:
//: Parcel10.java // Static inner classes package c07.parcel10; abstract class Contents { abstract public int value(); } interface Destination { String readLabel(); } public class Parcel10 { private static class PContents extends Contents { private int i = 11; 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()中,我们不需要Parcel10的工具;相反,我们用通例的语法来选择一个static成员,以便挪用将句柄返回Contents和Destination的要领。
凡是,我们不在一个接口里配置任何代码,但static内部类可以成为接口的一部门。由于类是“静态”的,所以它不会违反接口的法则——static内部类只位于接口的定名空间内部:
//: IInterface.java // Static inner classes inside interfaces interface IInterface { static class Inner { int i, j, k; public Inner() {} void f() {} } } ///:~
在本书早些时候,我发起各人在每个类里都配置一个main(),将其作为谁人类的测试床利用。这样做的一个缺点就是特别代码的数量太多。若不肯如此,可思量用一个static内部类容纳本身的测试代码。如下所示:
//: TestBed.java // Putting test code in a static inner class class TestBed { TestBed() {} void f() { System.out.println("f()"); } public static class Tester { public static void main(String[] args) { TestBed t = new TestBed(); t.f(); } } } ///:~
这样便生成一个独立的、名为TestBed$Tester的类(为运行措施,请利用“java TestBed$Tester”呼吁)。可将这个类用于测试,但不需在本身的最终刊行版本中包括它。