错误:无法访问Main类型的封闭实例.必须使用Main类型的封闭实例(例如x.new A()wh



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

无法访问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"
}

}

解决方案1

将教室与班级分隔开来Main对我来说很管用:

文件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"
}
}

文件室.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;
...

发生这种情况的原因

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

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

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

解决方案只是用public static class Room替换声明public class Room

最新更新