嗨,自从我写java已经有一段时间了,我似乎找不到这段代码有什么问题。我正在实现从链表中删除一个节点,但我的程序不会编译。我一直得到:
错误:非静态变量this不能从静态上下文中引用
Node head = new Node();
在我的主方法中所有的新Node()实例都有一个错误。
public class NodeDelete{
class Node {
int data;
Node next;
public Node(){ }
}
Node Delete(Node head, int position) {
// Complete this method
int index = 0;
Node current = head;
if (position == 0 ){
head = head.next;
}
else{
while (index < (position - 1)){
current = current.next;
}
current.next = current.next.next;
}
return head;
}
public static void main(String[] args) {
Node head = new Node();
head.data = 0;
Node node1 = new Node();
node1.data = 1;
Node node2 = new Node();
node2.data = 2;
head.next = node1;
node1.next = node2;
}
}
使Node
类为静态。或从NodeDelete
类中取出Node
类。这样问题就解决了。
Node
类是NodeDelete
的非静态内部类,因此它类似于NodeDelete
类的成员。要访问静态上下文中的任何成员,需要类的实例。这就是为什么你在这里得到编译时错误。
注意:您在Node
中定义的构造函数与默认构造函数相同。所以不需要定义它。这是多余的。
使Node类静态化:
static class Node {
int data;
Node next;
public Node(){ } // This is same as the default constructor. So this can be remove.
}
或
从NodeDelete类中取出相同的实现
Node
是一个非静态内部类。因此,需要一个包含类的实例来构造实例:
NodeDelete nd = ...
Node node = nd.new Node();
的替代品:
- 设置
Node
为静态内部类 - 设置
Node
为顶级类
由于在Node
的方法中没有引用NodeDelete
,我建议将Node
设置为静态
另一个尚未给出的选项(虽然不是我最喜欢的)是实例化包含main方法的类的实例,然后使用它来实例化内部类。像这样…
NodeDelete nd = new NodeDelete(...);
Node n = nd.new Node(...);