Java内部类与静态内部类的区别

    科技2024-10-14  18

    Java内部类与静态内部类的区别

    简单地区分内部类与静态内部类区别

    简单地区分内部类与静态内部类

    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则可以把该类隔离开,一般可以用于节点之类只能由内部进行实例化的操作。

    Processed: 0.019, SQL: 8