1.内部类:在类内部定义的没有static修饰的类 2.静态内部类:在类内部定义的被static修饰的类
1.外部类有指向内部类的引用,可以通过如下反编译代码看出:链接: 例子出处. 留意字段 final List this$0
private class List$Node { List$Node next; List$Node pre; Object data; final List this$0; List$Node(List$Node pre, Object data, List$Node next) { this$0 = List.this; super(); this.next = next; this.pre = pre; this.data = data; } } private static class List$Node { List$Node next; List$Node pre; Object data; List$Node(List$Node pre, Object data, List$Node next) { this.next = next; this.pre = pre; this.data = data; } }2.实例化的过程不同
public class MyClazz { class InnerClass{ } static class StaticInnerClass{ } } public class Test { public static void main(String[] args) { MyClazz myClazz = new MyClazz(); //需要外部类的对象才能创建 MyClazz.InnerClass innerClass = myClazz.new InnerClass(); //不需要外部类对象可以创建 MyClazz.StaticInnerClass staticInnerClass = new MyClazz.StaticInnerClass(); } }3.举例说明 Java源码里的LinkedList的Iterator使用内部类
//LinkedList内部 private class ListItr implements ListIterator<E> { private LinkedList.Node<E> lastReturned; private LinkedList.Node<E> next; private int nextIndex; private int expectedModCount; ... }HashMap里的Node节点则使用静态内部类
//HashMap内部 static class Node<K, V> implements Entry<K, V> { final int hash; final K key; V value; HashMap.Node<K, V> next; ... }4.应用场景 由于内部类对象需要被一个外部类对象绑定,可以理解为内部类的对象为外部类对象服务。 而静态内部类仅仅是被外部类绑定,创建的对象也不需要外部类对象的干预,把静态内部类设置为private则可以把该类隔离开,一般可以用于节点之类只能由内部进行实例化的操作。