本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
提问:Java-无法访问类型为Foo的封闭实例的解决办法
我有以下代码:
class Hello {
class Thing {
public int size;
Thing() {
size = 0;
}
}
public static void main(String[] args) {
Thing thing1 = new Thing();
System.out.println("Hello, World!");
}
}
我知道Thing构造函数什么也没做,但是有了它,我的Hello,World程序就不可以正常编译。
报错信息如下:
No enclosing instance of type Hello is accessible."
我猜是:
1, 我有系统级别的问题(在DrJava或Java安装中)或 2, 对如何在Java中构建工作程序有一些基本的误解。
回答1:
您已将该类声明Thing为非静态内部类。这意味着它必须与Hello该类的实例相关联。
在您的代码中,您尝试Thing从静态上下文创建的实例。这就是编译器所报错的。
有一些可能的解决方案。使用哪种解决方案取决于您要实现的目标。
1, 移动Thing类 从Hello类出去独自成一类。
2, 更改Thing为static类。
3, 创建Hello实例之前,先创建Thing实例
public static void main(String[] args)
{
Hello h = new Hello();
Thing thing1 = h.new Thing(); // hope this syntax is right, typing on the fly :P
}
如果任何Thing类实例依赖于有意义的Hello类实例,则最后一个解决方案(非静态嵌套类)将是强制性的。例如,如果我们有:
public class Hello {
public int enormous;
public Hello(int n) {
enormous = n;
}
public class Thing {
public int size;
public Thing(int m) {
if (m > enormous)
size = enormous;
else
size = m;
}
}
...
}
以下代码会出问题
Thing t = new Thing(31);
只能这样
Hello h = new Hello(30);
...
Thing t = h.new Thing(31);