Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java无法访问类型为的封闭实例_Java_Eclipse - Fatal编程技术网

Java无法访问类型为的封闭实例

Java无法访问类型为的封闭实例,java,eclipse,Java,Eclipse,在这里,我对Java非常陌生,有德语的类和方法标题。此代码旨在为扩展“Musiker”的每个类提供字符串输出。我已经看过了,但我的问题是将其更改为static会给类本身带来错误。我提出一个新问题的主要原因是,每一节课都按照计划进行。请不要奇怪为什么字符串看起来很奇怪,我从书中抄袭的这本书是为了幽默 public class Proberaum { public static void main(String[] args) { try { Musiker saenger =

在这里,我对Java非常陌生,有德语的类和方法标题。此代码旨在为扩展“Musiker”的每个类提供字符串输出。我已经看过了,但我的问题是将其更改为static会给类本身带来错误。我提出一个新问题的主要原因是,每一节课都按照计划进行。请不要奇怪为什么字符串看起来很奇怪,我从书中抄袭的这本书是为了幽默

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的引用?好的,刚刚测试过,谢谢您的耐心。你能告诉我把类放在不同的文件中修复错误的具体方法吗?如果你把它们放在不同的文件中,它们就不再嵌套了。因此,它们不会依赖于任何封闭类,这仅仅是因为没有封闭类。请解释为什么要这样做,而不是使用静态类。据我所知,这并不能很好地回答原来的问题。