java创建链表异常解决
问题解决
问题解释
该错误表明,在试图创建非静态类实例时,没有正确引用外部类的实例。
源代码如下
package vjudge;
import java.util.Scanner;
public class test {
// 节点类
public class Node {
int data;
Node next;
Node(int data) {
this.data = data;
this.next = null;
}
}
// 链表类
public class Link {
private Node head;
Link() {
this.head = null;
}
public void add(int data) {
if (this.head == null) {
Node p = new Node(data);
head = p;
} else {
Node p = new Node(data);
head.next = p;
}
}
}
public static void main(String[] args) {
Link link = new Link();
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int p = scanner.nextInt();
for (int i = 1; i <= n; i++) {
link.add(i);
}
}
}
问题分析
报错来源是Link link = new Link(); 由于非静态内部类依赖于外部类实例,Link是linklist的非静态内部类,所以它和linklist绑定,所以首先应该创建linklist的实例。
但是可以发现,Link类的add方法中,Node可以直接通过new实现,因为Link类也是linklist的非静态内部类,所以Link类的实例已经隐式地拥有了对linklist实例地调用。因为Node是linklist的内部类,并且Link已经具备了创建Node的上下文(即linklist的实例)
问题解决
修改代码如下
linklist list = new linklist(); // 先创建外部类的实例
Link link = list.new Link(); // 通过外部类实例来创建内部类对象