Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 内部类上操作的静态方法_Java_Static_Linked List_Static Methods_Inner Classes - Fatal编程技术网

Java 内部类上操作的静态方法

Java 内部类上操作的静态方法,java,static,linked-list,static-methods,inner-classes,Java,Static,Linked List,Static Methods,Inner Classes,我正在学习算法第四版(Sedgewick),对一些链表练习感到困惑,这些练习似乎要求为非静态节点实现静态方法。比如说, 1.3.27编写一个方法max(),该方法引用 链接列表作为参数,并返回中最大键的值 名单。假设所有键都是正整数,如果 列表是空的 或 1.3.31实现嵌套类DoubleNode以构建双链接列表, 其中,每个节点都包含对其前面的项的引用以及 列表中紧跟其后的项(null如果没有此类项)。然后 为以下任务实现静态方法:在 开始,在结尾插入,从开始删除,从 结束,在给定节点之前插入

我正在学习算法第四版(Sedgewick),对一些链表练习感到困惑,这些练习似乎要求为非静态节点实现静态方法。比如说,

1.3.27编写一个方法
max()
,该方法引用 链接列表作为参数,并返回中最大键的值 名单。假设所有键都是正整数,如果 列表是空的

1.3.31实现嵌套类DoubleNode以构建双链接列表, 其中,每个节点都包含对其前面的项的引用以及 列表中紧跟其后的项(
null
如果没有此类项)。然后 为以下任务实现静态方法:在 开始,在结尾插入,从开始删除,从 结束,在给定节点之前插入,在给定节点之后插入,以及 删除给定的节点

据我所知(并由SO的回答和确认),这是不可能的。正如预期的那样,如果我尝试在超类中编写静态方法,Eclipse会出现错误:

public class DoublyLinkedList<Item> {

    public static void insertStart(DoubleNode first) {
        // implementation
    }

    private class DoubleNode {
        Item item;
        DoubleNode next;
        DoubleNode previous;

    }
}
(给出错误
方法insertStart不能声明为静态;静态方法只能声明为静态或顶级类型

我可以编写所需的方法作为
DoublyLinkedList
类的实例方法,这对我来说是最自然的


然而,我觉得我可能错过了一些重要的事情。作者明确指出这些方法应该是静态的,并且还建议将对第一个节点的引用作为参数(这对于实例方法来说是不必要的,因为类将为第一个节点提供一个实例变量)。我遗漏了什么?

您可以将嵌套类设置为
静态
。您将失去具有封闭父类实例的约束,但它将允许您从静态方法对
DoubleNode
s进行操作:

// This will compile
public class DoublyLinkedList<Item> {

    public static <T> void insertStart(DoublyLinkedList<T> list, DoubleNode<T> first) {
        // implementation
    }

    private static class DoubleNode<E> {
        E item;
        DoubleNode<E> next;
        DoubleNode<E> previous;

    }
}
如果您想知道,JDK的
LinkedList
实现中也是这样做的:

// Source : Oracle JDK 1.7.0_67 lib - inside LinkedList class
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;
    }
}
//来源:Oracle JDK 1.7.0_67 lib-LinkedList类内部
私有静态类节点{
E项目;
节点下一步;
节点前置;
节点(上一个节点、E元素、下一个节点){
this.item=元素;
this.next=next;
this.prev=prev;
}
}

作为旁注,我同意将这些方法作为实例成员编写更为自然;在OOP库中通常都是这样做的。我没有一本Sedgewick的书,但看起来他试图同时教你嵌套类操作和列表实现;)

多谢各位。看到JDK实现很有趣。在这种情况下,约束的重要性是什么?约束是阻止代码成功编译的因素。它可以确保您不能使用变量来保存“独立的”
DoubleNode
对象,也不能定义返回类型为
DoubleNode
的值的静态或外部方法。要点是鼓励封装(“将所有
DoubleNode
内容保留在
DoublyLinkedList
实例方法中”),但在这种情况下,它违背了“生成静态方法”语句。您可以在此处阅读关于各种嵌套类类型的基本介绍:好的。原始答案中的代码无法编译-这似乎是
参数化的问题。我在第4行和第9行得到错误
无法静态引用非静态类型项
。很抱歉,我刚刚意识到在整个列表类中有一个
类型参数。我马上就纠正。
public static void insertStart(DoublyLinkedList<?> list, DoubleNode<?> first) {
    ...
}
// Source : Oracle JDK 1.7.0_67 lib - inside LinkedList class
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;
    }
}