Как вставить обьект в масив?
Проблема такова: мне нужно вставить в масив обьекты, которые создаются в конструкторе другого класа. Абстрактный клас
package pack;
public abstract class Instrument {
String nazwa;
public Instrument() {
nazwa = "";
}
public Instrument(String nazwa) {
this.nazwa = nazwa;
}
public String toString() {
return ("Instrument o nazwie " + nazwa);
}
public abstract String wydajDzwiek();
public abstract void graj();
}
Клас инструментов одного вида
package pack;
public class InstrumentDety extends Instrument {
int lt;
public InstrumentDety() {
InstrumentDety inst = new InstrumentDety();
inst.nazwa = "Zlota Trabka";
}
public InstrumentDety(String nazwa, int a) {
lt = a;
for (int i = 0; i < a; i++) {
InstrumentDety inst = new InstrumentDety();
inst.nazwa = nazwa;
}
}
public String wydajDzwiek() {
return "Tra ta ta";
}
public void graj() {
for (int i = 0; i < lt; i++) {
wydajDzwiek();
}
}
public String toString() {
return "Instument dety = " + nazwa + " [lt = " + lt + "]";
}
}
Клас инструментов другого вида
package pack;
public class InstrumentSmyczkowy extends Instrument{
int ls;
public InstrumentSmyczkowy() {
InstrumentDety inst = new InstrumentDety();
inst.nazwa = "Stradivarus";
}
public InstrumentSmyczkowy(String nazwa, int a) {
ls = a;
for (int i = 0; i < a; i++) {
InstrumentDety inst = new InstrumentDety();
inst.nazwa = nazwa;
}
}
public String wydajDzwiek() {
return "Smyk smyk smyk";
}
public void graj() {
for (int i = 0; i < ls; i++) {
wydajDzwiek();
}
}
public String toString() {
return "Instument dety = " + nazwa + " [lt = " + ls + "]";
}
public boolean jestKontrabasem() {
if (nazwa.equals("kontrabas")) {
return true;
}
else {
return false;
}
}
}
Мейновый клас
package pack;
import pack.InstrumentDety;
import pack.InstrumentSmyczkowy;
public class Orkiestra {
static Instrument [] instrument = new Instrument [20];
int n;
public static void main(String[] args) {
instrument[0] = new InstrumentDety();
instrument[1] = new InstrumentDety("rog", 1);
instrument[2] = new InstrumentDety("puzon", 1);
instrument[3] = new InstrumentDety("klarnet", 1);
instrument[4] = new InstrumentDety("tuba", 1);
instrument[5] = new InstrumentSmyczkowy();
instrument[6] = new InstrumentSmyczkowy("altowka", 1);
instrument[7] = new InstrumentSmyczkowy("wiolonczela", 1);
instrument[8] = new InstrumentSmyczkowy("kontrabas", 1);
}
}
Проблема в том, что когда я делаю таким способом, у меня возникает такая ошибка: Exception in thread "main" java.lang.StackOverflowError
Заранее спасибо за помощь.
Ответы (2 шт):
Уберите бессмысленный код, и ошибки не будет.
public InstrumentDety() {
//InstrumentDety inst = new InstrumentDety();
//inst.nazwa = "Zlota Trabka";
}
public InstrumentDety(String nazwa, int a) {
lt = a;
for (int i = 0; i < a; i++) {
//InstrumentDety inst = new InstrumentDety();
//inst.nazwa = nazwa;
}
}
...
public InstrumentSmyczkowy() {
//InstrumentDety inst = new InstrumentDety();
//inst.nazwa = "Stradivarus";
}
public InstrumentSmyczkowy(String nazwa, int a) {
ls = a;
for (int i = 0; i < a; i++) {
//InstrumentDety inst = new InstrumentDety();
//inst.nazwa = nazwa;
}
}
Конструкторы не должны вызывать внутри себя конструкторы других объектов потомков/предков, чтобы избежать рекурсии/зацикливания.
Кроме того, нужно учитывать, что при вызове конструктора класса-потомка будет автоматически вызываться конструктор его класса-предка, и в данном случае нужно вызвать правильный конструктор Instrument, чтобы проинициализировалось его название.
Код следует исправить следующим образом:
public abstract class Instrument {
String nazwa;
public Instrument() {
this(""); // лучше передать "nie ma nazwy"
}
public Instrument(String nazwa) {
this.nazwa = nazwa;
}
// ...
}
Духовые инструменты, добавили конструктор только с названием
public class InstrumentDety extends Instrument {
int lt;
public InstrumentDety() {
this("Zlota Trabka");
}
public InstrumentDety(String nazwa) {
this(nazwa, 1);
}
public InstrumentDety(String nazwa, int a) {
super(nazwa); // вызов конструктора предка с параметром
lt = a;
}
public String wydajDzwiek() {
return "Tra ta ta";
}
// ...
}
Аналогично струнные инструменты:
public class InstrumentSmyczkowy extends Instrument {
int ls;
public InstrumentSmyczkowy() {
this("Stradivarus");
}
public InstrumentSmyczkowy(String nazwa) {
this(nazwa, 1);
}
public InstrumentSmyczkowy(String nazwa, int a) {
super(nazwa); // вызов конструктора предка с параметром
ls = a;
}
public String wydajDzwiek() {
return "Smyk smyk smyk";
}
// ...
}
Теперь можно будет создавать инструменты для оркестра в классе Orkiestra:
instrument[0] = new InstrumentDety(); // Zlota trabka, 1
instrument[1] = new InstrumentDety("rog");
instrument[2] = new InstrumentDety("puzon");
instrument[3] = new InstrumentDety("klarnet", 2);
instrument[4] = new InstrumentDety("tuba");
instrument[5] = new InstrumentSmyczkowy(); // Stradivarus, 1
instrument[6] = new InstrumentSmyczkowy("altowka", 2);
instrument[7] = new InstrumentSmyczkowy("wiolonczela", 2);
instrument[8] = new InstrumentSmyczkowy("kontrabas");