是什么导致错误“无法访问 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 构建一个工作程序有一些基本的误解。

有任何想法吗?

原文由 coolpapa 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 571
2 个回答

static class Thing 将使您的程序运行。

事实上,你有 Thing 作为内部类,它(根据定义)与 Hello 的特定实例相关联(即使它从未使用或引用它) ,这意味着在范围内没有特定的 Hello 实例的情况下说 new Thing(); 是错误的。

如果您将其声明为静态类,那么它就是一个“嵌套”类,不需要特定的 Hello 实例。

原文由 jacobm 发布,翻译遵循 CC BY-SA 3.0 许可协议

您已将类 Thing 声明为非静态内部类。这意味着它必须与 Hello 类的实例相关联。

在您的代码中,您试图从静态上下文创建 Thing 的实例。这就是编译器所抱怨的。

有几种可能的解决方案。使用哪种解决方案取决于您想要实现的目标。

  • Thing 移出 Hello 类。

  • Thing 更改为 static 嵌套类。

   static class Thing

  • 在创建 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 的对象,如:

 Thing t = new Thing(31);

会有问题,因为不会有明显的 enormous 值来测试 31。实例 h Hello 外部类的一个实例需要提供这个 h.enormous 值:

 ...
Hello h = new Hello(30);
...
Thing t = h.new Thing(31);
...

因为它并不意味着 Thing 如果它没有 Hello

有关嵌套/内部类的更多信息: 嵌套类(Java 教程)

原文由 helloworld922 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题