错误:无法访问类型为Main的封闭实例。必须使用Main类型的封闭实例来限定分配(例如x.new A()wh

时间:2019-11-12 21:11:03

标签: java arrays variables

我的代码不起作用。我收到以下错误:

  

没有可访问的Main类型的封闭实例。必须使用一个封闭的类型为Main的实例来限制分配(例如x.new A(),其中x是Main的实例)。

您将在下面看到我的代码:

class Main {

public class Room {
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + etage;
        result = prime * result + gebäude;
        result = prime * result + raumnummer;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Room other = (Room) obj;
        if (etage != other.etage)
            return false;
        if (gebäude != other.gebäude)
            return false;
        if (raumnummer != other.raumnummer)
            return false;
        return true;
    }

    public int gebäude;
    public int etage;
    public int raumnummer;

    public Room(int gebäude, int etage, int raumnummer) {
        super();
        this.gebäude = gebäude;
        this.etage = etage;
        this.raumnummer = raumnummer;
    }

    @Override
    public String toString() {
        String s = String.format("%2s-%s.%02d", this.gebäude, this.etage, this.raumnummer);
        return s;
    }
}

public static void main(String[] args) {
    Room office = new Room(17, 0, 10);
    Room lecture = new Room(2, 0, 10);
    Room lab = new Room(18, 1, 1);

    System.out.println(office);  // => "17-0.10"
    System.out.println(lecture); // => " 2-0.10"
    System.out.println(lab);     // => "18-1.01"
}

}

2 个答案:

答案 0 :(得分:1)

解决方案1 ​​

将班级房间与班级主班分开对我有用:

文件Main.java:

public class Main {

public static void main(String[] args) {
    Room office = new Room(17, 0, 10);
    Room lecture = new Room(2, 0, 10);
    Room lab = new Room(18, 1, 1);

    System.out.println(office);  // => "17-0.10"
    System.out.println(lecture); // => " 2-0.10"
    System.out.println(lab);     // => "18-1.01"
}
}

文件Room.java:

public class Room {
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + etage;
        result = prime * result + gebäude;
        result = prime * result + raumnummer;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Room other = (Room) obj;
        if (etage != other.etage)
            return false;
        if (gebäude != other.gebäude)
            return false;
        if (raumnummer != other.raumnummer)
            return false;
        return true;
    }

    public int gebäude;
    public int etage;
    public int raumnummer;

    public Room(int gebäude, int etage, int raumnummer) {
        super();
        this.gebäude = gebäude;
        this.etage = etage;
        this.raumnummer = raumnummer;
    }

    @Override
    public String toString() {
        String s = String.format("%2s-%s.%02d", this.gebäude, this.etage, this.raumnummer);
        return s;
    }
}

让我调查为什么会发生这种情况,然后我将发布原因。现在,如果您不需要两个类都在同一文件中,那么这是一个合适的修复程序。

解决方案2

让房间保持静态:

...
class Main {

public static class Room {
    @Override
    public int hashCode() {
        final int prime = 31;
...

为什么会发生

this post中所述,通过将Room作为Main的内部类,您正在强制Room的实例具有Main的实例。在内部类Room上使用new运算符而不创建Main的新实例时,会产生错误。

通过将类Room设置为静态,该类不需要Main的实例。

答案 1 :(得分:0)

这是因为RoomMain的内部类,但是没有声明为static成员。当您有一个非静态内部类时,只能使用外部类的对象实例化,否则表达式Main.this(在内部类中是合法的)将没有{{1}的实例}引用。由于Main方法是main,因此没有static实例可以传递给Main构造函数。

解决方案只是将声明Room替换为public class Room