Java编译错误:无法访问LinkedListStack封闭实例,问题何在?
解决“No enclosing instance of type LinkedListStack is accessible”错误
咱们先拆解下这个错误的根源:你的MyStack是LinkedListStack的非静态内部类,而你是在静态的main方法里直接创建它的实例。
这里要明白一个关键规则:静态方法属于整个类,不依赖任何类的实例就能运行;但非静态内部类是外部类的“成员”,它的对象必须依附于外部类的实例才能存在——就像你得先有个房子(外部类实例),才能在房子里放家具(内部类实例)。静态方法里没有外部类的实例,自然没法直接创建非静态内部类的对象,编译器就会报错啦。
下面给你两种常用的解决办法:
方法一:把MyStack改成静态内部类
这是最常用的方案,如果你不需要MyStack访问LinkedListStack的非静态成员,直接给MyStack加上static关键字,让它变成属于LinkedListStack类本身的静态内部类,这样就不需要外部实例就能创建对象了:
import java.util.LinkedList; public class LinkedListStack { public static void main(String[] args) { MyStack<Integer> stack = new MyStack<>(); // 现在就能正常运行了 } // 加上static关键字,转为静态内部类 static class MyStack<T> { private LinkedList<T> list = new LinkedList<>(); // 这里可以补充栈的操作方法,比如push、pop等 public void push(T item) { list.addFirst(item); } public T pop() { return list.removeFirst(); } } }
方法二:先创建外部类实例,再通过实例创建内部类对象
如果你确实需要MyStack作为非静态内部类(比如要访问外部类的非静态成员),那就在main方法里先创建LinkedListStack的实例,再通过这个实例来生成MyStack对象:
import java.util.LinkedList; public class LinkedListStack { public static void main(String[] args) { // 先创建外部类的实例 LinkedListStack outer = new LinkedListStack(); // 通过外部实例创建内部类对象 MyStack<Integer> stack = outer.new MyStack<>(); } class MyStack<T> { private LinkedList<T> list = new LinkedList<>(); // 内部类的方法实现 } }
一般情况下,推荐用第一种方法,因为静态内部类更独立,也符合栈这种数据结构的封装需求。
内容的提问来源于stack exchange,提问作者Be Br
相关产品推荐
相关产品推荐

