那里我对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 {
}
}
答案 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();