首页 > 编程知识 正文

内部类和静态类的区别,Java 内部静态类

时间:2023-05-06 15:59:41 阅读:220771 作者:3138

在阅读Java Collection Framwork时,LinkedList中有个静态内部类:

private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }

它为什么被定义成静态呢?从之前的学习中,我们应该对静态这个关键字有一定的了解,静态代表它是属于类的,而不是属于实例的。我们可以通过类名直接对静态的玩意儿直接进行引用,但这里的Node静态内部类却是私有的。
为了找到静态内部类和普通内部类的区别,我使用jad工具,自己重写一个类似的Node类,对其进行反编译后发现:

普通内部类版本:

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; }}

嗯,从以上例子有可以发现,区别很明显:
在非静态的内部类中,存在一个隐藏的外部类引用字段,在构造内部类时,用于指向外部类的引用。每次生成一个非静态的内部类实例,都会有这样的操作。
恰巧Node类只是外部类的一个组件,他不需要引用外部类的任何字段,所以,把它声明成静态的能减小不必要的消耗。

所以,在定义一个内部类时,如果该内部类不需要引用外部类的非静态属性/方法,则应该将它声明为静态的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。