A static member class (or interface) is much like a regular top-level class (or interface). For convenience, however, it is nested within another class or interface. Example 3-8 shows a helper interface defined as a static member of a containing class. The example also shows how this interface is used both within the class that contains it and by external classes. Note the use of its hierarchical name in the external class.
// A class that implements a stack as a linked list public class LinkedStack { // This static member interface defines how objects are linked public static interface Linkable { public Linkable getNext(); public void setNext(Linkable node); } // The head of the list is a Linkable object Linkable head; // Method bodies omitted public void push(Linkable node) { ... } public Object pop() { ... } } // This class implements the static member interface class LinkableInteger implements LinkedStack.Linkable { // Here's the node's data and constructor int i; public LinkableInteger(int i) { this.i = i; } // Here are the data and methods required to implement the interface LinkedStack.Linkable next; public LinkedStack.Linkable getNext() { return next; } public void setNext(LinkedStack.Linkable node) { next = node; } }
A static member class or interface is defined as a static member of a containing class, making it analogous to the class fields and methods that are also declared static. Like a class method, a static member class is not associated with any instance of the containing class (i.e., there is no this object). A static member class does, however, have access to all the static members (including any other static member classes and interfaces) of its containing class. A static member class can use any other static member without qualifying its name with the name of the containing class.
A static member class has access to all static members of its containing class, including private members. The reverse is true as well: the methods of the containing class have access to all members of a static member class, including the private members. A static member class even has access to all the members of any other static member classes, including the private members of those classes.
Since static member classes are themselves class members, a static member class can be declared with its own access control modifiers. These modifiers have the same meanings for static member classes as they do for other members of a class. In Example 3-8, the Linkable interface is declared public, so it can be implemented by any class that is interested in being stored on a LinkedStack.
A static member class cannot have the same name as any of its enclosing classes. In addition, static member classes and interfaces can be defined only within top-level classes and other static member classes and interfaces. This is actually part of a larger prohibition against static members of any sort within member, local, and anonymous classes.
In code outside of the containing class, a static member class or interface is named by combining the name of the outer class with the name of the inner class (e.g., LinkedStack.Linkable). You can use the import directive to import a static member class:
import LinkedStack.Linkable; // Import a specific inner class import LinkedStack.*; // Import all inner classes of LinkedStack
Importing inner classes is not recommended, however, because it obscures the fact that the inner class is tightly associated with its containing class.
Copyright © 2001 O'Reilly & Associates. All rights reserved.