转载:http://www.cnblogs.com/simply-zhao/archive/2008/04/13/1151122.html
[静态内部类]
类声明中包含“static”关键字的内部类。如以下示例代码:
public class InnerClass { private static String nickName = "anan"; private String name; private int age; public InnerClass(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public static class Inner { private String heart = "zhaoli"; public String getHeart() { return heart; } public void setHeart(String h) { this.heart = h; } public void print() { System.out.println(InnerClass.nickName); System.out.println(getHeart()); } } }
public class InnerClassTest { public static void main(String[] args) { InnerClass.Inner inner = new InnerClass.Inner(); inner.print(); inner.setHeart("simple-simply"); inner.print(); } }
这里说明public 修饰的静态内部类其实跟外部类的使用并没有太大区别,以“OuterClass.InnerClass”的方式来引用某个如此修饰的静态内部类。
<静态成员类特性>
<静态成员类约束>
什么时候使用静态成员类
B为A的辅助类,且只为A所用时,可将B定义为A的静态成员类。例如JDK中的LinkedList类就有Entry静态成员类:
public class LinkedList<E> extends AbstractSequentialList<E> …; private static class Entry<E> { E element; Entry<E> next; Entry<E> previous; Entry(E element, Entry<E> next, Entry<E> previous) { this.element = element; this.next = next; this.previous = previous; } } …; }
public class InnerClass { private static String nickName = "anan"; private String name; private int age; public InnerClass(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public class Inner { private String heart = "zhaoli"; public String getHeart() { return heart; } public void setHeart(String h) { this.heart = h; } public void print() { System.out.println(InnerClass.nickName); System.out.println(InnerClass.this.name); System.out.println(InnerClass.this.age); System.out.println(getHeart()); } } } public class InnerClassTest { public static void main(String[] args) { InnerClass outer = new InnerClass("simply-simple", 23); InnerClass.Inner inner = outer.new Inner(); inner.print(); } }
另外,如示例代码所示,对于给定的一个外部类实例outerClass,可以直接创建其内部类实例,语法形式为:
OuterClass.InnerClass innerClass = outerClass.new InnerClass(); |
什么时候使用成员类
成员类的显著特性就是成员类能访问它的外部类实例的任意字段与方法。方便一个类对外提供一个公共接口的实现是成员类的典型应用。以JDK Collection类库为例,每种Collection类必须提供一个与其对应的Iterator实现以便客户端能以统一的方式遍历任一Collection实例。每种Collection类的Iterator实现就被定义为该Collection类的成员类。例如JDK中AbstractList类的代码片断:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> { private class Itr implements Iterator<E> { ………; } public Iterator<E> iterator() { return new Itr(); } }
因为定义在AbstractList中的Itr可访问AbstractList中的任意字段和方法,所以很方便实现Iterator,无需AbstractList对外暴露更多的接口。
试想,如果没有成员类机制,只有在AbastractList源码之外定义一个实现Iterator的类Itr,该类有一个AbstractList实例成员list,为了Itr能获取list的内部信息以便实现遍历,AbstractList必然要向Itr开放额外的访问接口。