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

时间:2016-09-22 05:17:37

标签: java eclipse

那里我对Java很新,并且有德语课程和方法标题。此代码旨在为每个扩展“Musiker”的类提供字符串输出。我已经看过SO但我的问题是将它改为静态会给类本身带来错误。我打开一个新课题的主要原因是,每个其他班级都按计划运作。请不要错过为什么Strings看起来很奇怪,我复制的这本书是幽默的。

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 {

}

}

3 个答案:

答案 0 :(得分:1)

您的Saenger类实际上是Proberaum类的非静态成员。因为它是非静态的,所以在使用任何这些类之前,您实际上需要创建Proberaum的实例:

Proberaum proberaumObject = new Proberaum();
Musiker saenger = new proberaumObject.Saenger();

在你的情况下,类中的类可能不是你想要做的。如果将每个类提取到自己的文件中,您应该会发现问题消失。 (如果由于某种原因无法实现,那么将子类声明为static也应该有用。)

答案 1 :(得分:0)

就像Joe C在他的回答中提到的那样:问题的核心是你的类// Backend routes Route::group(['domain' => Controller::getAppDomain(), 'middleware' => 'auth'], function () { Route::get('/', ['as' => 'dashboard', 'uses' => 'Controller@dashboard']); // ...various other backend routes... }); // Frontend routes Route::auth(); Route::get('/', function () { return view('frontend'); }); Saenger等等都是嵌套类(嵌套在Musiker内),但它们被定义为非静态的。

在Java中,非静态嵌套类被称为"内部类"。内部类具有对其封闭类成员(甚至是私有类)的隐式访问,但当然,另一方面,首先需要该封闭类的对象以供内部类引用。这就是编译器在你的例子中抱怨的原因:你正在尝试创建类Proberaum的对象,这是Saenger的内部类,所以要创建它需要的对象对Proberaum类型的对象的引用。由于您在(静态)Proberaum方法中进行对象创建,因此不存在此类对象。

所以,要修复,你必须改变你的内部类。最简单的方法是将它们全部声明main。请注意,您可以另外进行此操作static

public

正如其他地方所说,你真的不应该把每个类放在同一个文件中。学习每个文件使用一个类,它是Java Way™。

答案 2 :(得分:0)

除了可以将嵌套类声明为静态类之外,还可以创建嵌套类的对象,如下所述。

Proberaum proberaumObject = new Proberaum();
Musiker saenger = proberaumObject.new Saenger();