Java无法访问类型为的封闭实例
在这里,我对Java非常陌生,有德语的类和方法标题。此代码旨在为扩展“Musiker”的每个类提供字符串输出。我已经看过了,但我的问题是将其更改为static会给类本身带来错误。我提出一个新问题的主要原因是,每一节课都按照计划进行。请不要奇怪为什么字符串看起来很奇怪,我从书中抄袭的这本书是为了幽默Java无法访问类型为的封闭实例,java,eclipse,Java,Eclipse,在这里,我对Java非常陌生,有德语的类和方法标题。此代码旨在为扩展“Musiker”的每个类提供字符串输出。我已经看过了,但我的问题是将其更改为static会给类本身带来错误。我提出一个新问题的主要原因是,每一节课都按照计划进行。请不要奇怪为什么字符串看起来很奇怪,我从书中抄袭的这本书是为了幽默 public class Proberaum { public static void main(String[] args) { try { Musiker saenger =
public class Proberaum {
public static void main(String[] args) {
try {
Musiker saenger = new Saenger();
Musiker gitarrist = new Gitarrist();
Musiker bassist = new Bassist();
Musiker trompeter = new Trompeter();
Musiker backgroundSaengerin = new BackgroundSaengerin();
machtMusik(saenger, gitarrist, bassist, trompeter, backgroundSaengerin);
} catch(Exception e) {
new Exception().printStackTrace();
}
}
public static void machtMusik(Musiker... gruppe) {
for(Musiker musiker : gruppe) {
musiker.musizieren();
}
}
public class Musiker {
private String name;
private int alter;
private Band band;
public void musizieren() {
System.out.println("OO Mmmmmmmmh, OO Mmmmmmmmh");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAlter() {
return alter;
}
public void setAlter(int alter) {
this.alter = alter;
}
public Band getBand() {
return band;
}
public void setBand(Band band) {
this.band = band;
}
}
public class Band {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Saenger extends Musiker {
@Override
public void musizieren() {
this.singen();
}
public void singen() {
System.out.println("Oh, bäbi, juuuu a mei sannnnscheiiiiin");
}
}
public class BackgroundSaengerin extends Saenger {
}
public class Bassist extends Musiker {
}
public class Gitarrist extends Musiker {
public void musizieren() {
System.out.println("Tschiiiiiingzäääängggggg");
}
}
public class Trompeter extends Musiker {
}
}您的
Saenger
类实际上是Proberaum
类的非静态成员。因为它是非静态的,所以在使用这些类之前,实际上需要创建Proberaum
的实例:
Proberaum proberaumObject = new Proberaum();
Musiker saenger = new proberaumObject.Saenger();
在您的情况下,类中的类可能不是您想要做的。如果您将每个类提取到自己的文件中,您应该会发现您的问题消失了。(如果出于任何原因不可能这样做,那么将子类声明为
static
也应该起作用。)就像Joe C在他的回答中提到的那样:问题的核心是你的类Saenger
,Musiker
等都是嵌套类(嵌套在Proberaum
中),但它们被定义为非静态的
在Java中,非静态嵌套类称为“内部类”。内部类具有对其封闭类成员(甚至是私有成员)的隐式访问权限,但当然,这的另一面是,首先需要有封闭类的对象供内部类引用。这就是编译器在您的示例中抱怨的原因:您试图创建一个类为Saenger
的对象,它是Proberaum
的内部类,因此要创建该对象,它需要对类型为Proberaum
的对象进行引用。由于您是在(静态)main
方法中创建对象,因此不存在这样的对象
所以,要解决这个问题,您必须更改您的内部类。最简单的方法是将它们全部声明为静态。请注意,除了将它们公开之外,您还可以这样做:
public static class Seanger extends Musiker { ...
然而,正如其他地方所指出的,您确实不应该将每个类都放在同一个文件中。学习使用每个文件一个类,这是Java方式™. 除了将嵌套类声明为静态类之外,还可以创建嵌套类的对象,如下所述
Proberaum proberaumObject = new Proberaum();
Musiker saenger = proberaumObject.new Saenger();
德语和字符串不是问题,但您确实应该指出错误消息在源代码中出现的位置。所有这些都在一个文件中吗?发布堆栈跟踪所有内容都在一个文件中,错误出现在第三行(用注释标记,Stacktrace将是editet)相关问题:@JeenBroekstra,因为它与我无关,这一点都不相关。当我错了,告诉我使用一本书的代码,它告诉我要有公共课。我唯一可以尝试的是从musiker类中提取Saenger类等,并将所有内容都包含在Proberaum类中。我刚刚检查了这两个方法,但No.2给出了这个错误:由于某些中间构造函数调用,没有Proberaum类型的封闭实例可用。第一个错误是:Musiker.Saenger无法解析为类型。这个答案不太正确:
Saenger
不是Musiker
的内部类,而是Proberaum
的内部类。因此,如果您希望采用这种方法,而不是创建一个Musiker
,您应该创建一个Proberaum
对象。编辑您的答案以解决此问题。好的,我明白您的意思,但就我所做的努力而言,仅删除Saenger类即可解决问题,这意味着所有其他类都可以解决此问题。不,其他类也会出现相同的错误。取决于您使用的编译器,您可能不会立即看到这一点,因为它首先检测到其他错误。例如,在调用machtMusik时,您是否删除了对变量saenger的引用?好的,刚刚测试过,谢谢您的耐心。你能告诉我把类放在不同的文件中修复错误的具体方法吗?如果你把它们放在不同的文件中,它们就不再嵌套了。因此,它们不会依赖于任何封闭类,这仅仅是因为没有封闭类。请解释为什么要这样做,而不是使用静态类。据我所知,这并不能很好地回答原来的问题。