什么原因导致错误“Foo类型的封闭实例可访问”,我该如何修复它?

2022-08-31 04:53:01

我有以下代码:

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!");
    }
}

我知道什么都不做,但是我的Hello,World程序在没有它的情况下编译得很好。只有我定义的类在我身上失败了。Thing

它拒绝编译。我得到了创造一个新事物的线。我猜是:No enclosing instance of type Hello is accessible."

  1. 我有系统级问题(无论是在DrJava中还是我的Java安装中)或
  2. 我对如何在java中构建工作程序有一些基本的误解。

有什么想法吗?


答案 1

static class Thing将使您的程序正常工作。

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

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


答案 2

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

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

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

  • 搬出班级。ThingHello

  • 更改为嵌套类。Thingstatic

    static class Thing
    
  • 在创建 的实例之前创建 的实例。HelloThing

    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
    }
    

最后一个解决方案(非静态嵌套类)将是必需的,如果依赖于实例 的任何实例是有意义的。例如,如果我们有:ThingHello

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);

这将是有问题的,因为没有一个明显的值来测试31反对它。外部类的实例是提供此值所必需的:enormoushHelloh.enormous

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

因为它并不意味着如果它没有.ThingHello

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


推荐