为什么链表中的节点类被定义为静态类而不是普通类

17 浏览
0 Comments

为什么链表中的节点类被定义为静态类而不是普通类

这个问题已经有答案了:

Java内部类和静态嵌套类

在java.util.LinkedList包中,类Node被定义为一个静态类,这是必要的吗?目的是什么?

我们可以从这个页面中找到源代码。

admin 更改状态以发布 2023年5月20日
0
0 Comments

静态嵌套类实例没有引用嵌套类的引用。这与将它们放在一个单独的文件中相同,但如果与嵌套类的内聚性高,则将它们作为嵌套类是一个不错的选择。

然而,非静态嵌套类需要创建嵌套类的实例,并且实例绑定到那个实例并具有对其字段的访问权。

例如,考虑这个类:

public class Main{
  private String aField = "test";
  public static void main(String... args) {
    StaticExample x1 = new StaticExample();
    System.out.println(x1.getField());
    //does not compile:
    // NonStaticExample x2 = new NonStaticExample();
    Main m1 = new Main();
    NonStaticExample x2 = m1.new NonStaticExample();
    System.out.println(x2.getField());
  }
  private static class StaticExample {
    String getField(){
        //does not compile
        return aField;
    }
  }
  private class NonStaticExample {
    String getField(){
        return aField;
    }
  }

静态类StaticExample可以直接实例化,但无法访问嵌套类Main的实例字段。
非静态类NonStaticExample需要实例Main才能被实例化,并且可以访问实例字段aField

回到你的LinkedList示例,这基本上是一个设计选择。

Node的实例不需要访问LinkedList的字段,但将它们放在单独的文件中也没有意义,因为Node是LinkedList实现的实现细节,对于该类之外没有用处。因此,将其作为静态嵌套类是最明智的设计选择。

0