1.7 Java-无法访问类型为Foo的封闭实例的解决办法| Java Debug 笔记

108 阅读1分钟

本文正在参加「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);