Klassen Verschiedene Klassen und Konstruktoren

lesni

Mitglied
Schön guten Abend,

ich habe Probleme zu verstehen, weshalb mein Programm nicht das tut, was es tun soll. Ich habe verschiedene Klassen (CDTrack, CD, CDTest - siehe unten) und will letztendlich, dass ich bei Ausführung von CDTest.java folgende Infos ausgespuckt bekomme: Titel der CD, Name des Künstlers und nacheinander sämtliche Lieder. Aber der Reihe nach und hier erstmal mein Code:

Java:
class CDTrack{
	
	//Die Attribute der Klasse werden definiert.
	
	int laengeInSekunden;
	String kuenstler;
	String titel;
	
	//Zwei Konstrukturen stehen zur Initialisierung der Attribute bereit.
	
	public CDTrack (int laengeInSekunden, String titel, String kuenstler){
		this.laengeInSekunden = laengeInSekunden;
		this.titel = titel;
		this.kuenstler = kuenstler;
	}

	public CDTrack (int laengeInSekunden, String titel){
		this.laengeInSekunden = laengeInSekunden;
		this.titel = titel;
		kuenstler = "Various Artists";
	}
}

Java:
class CD{

	//Attribute werden definiert.

	CDTrack [] tracks;
	String titel;
	String kuenstler;

	//Mithilfe des Konstruktors können die Attribute initialisiert werden.
	
	public CD (CDTrack [] tracks, String titel){
		this.tracks = tracks;
		this.titel = titel;
		tracks[0].kuenstler = kuenstler;
	}
	
	//Die Methode "printCD" gibt die CD-Informationen auf der Konsole aus.
	
	public static void printCD (CD cd){
		System.out.println();
		System.out.println("Albumtitel: "+cd.titel);
		System.out.println("Kuenstler der CD: "+cd.kuenstler);
		System.out.println("Kuenstler, Titel, Laenge der einzelnen Tracks: "+cd.tracks);
	}
}

Java:
class CDTest{
	public static void main(String [] args){
	
		//Ein array von 5 Liedern wird erstellt.
		
		CDTrack [] lieder = new CDTrack[5];
		
		//Die einzelnen Lieder werden initialisiert.
		
		lieder [0] = new CDTrack (99,"Lied_1");
		lieder [1] = new CDTrack (88,"Lied_2");
		lieder [2] = new CDTrack (77,"Lied_3");
		lieder [3] = new CDTrack (66,"Lied_4","Kuenstler_1");
		lieder [4] = new CDTrack (55,"Lied_5","Kuenstler_2");
		
		//Eine neue CD wird erstellt.
		
		CD Album = new CD(lieder,"Die Klassiker");
		
		//Der Inhalt der CD wird auf der Konsole ausgegeben.
	
		CD.printCD(Album);
	}
}

Kompilieren lässt sich das ganze. Leider verstehe ich zweierlei nicht:

Bei Namen des Kuenstlers erhalte ich auf der Konsole die Ausgabe "null". Hier nehme ich an, dass der Konstruktor "public CD" meine die Anweisung "tracks[0].kuenstler = kuenstler;" nicht richtig versteht (bzw. ich verstehe Java nicht). Ich will erreichen, dass der Künstler des ersten CD-Tracks automatisch der Künstler der gesamten CD ist. Warum kommt hier "null" raus - was mache ich falsch?

Desweiteren funktioniert die Anweisung "System.out.println("Kuenstler, Titel, Laenge der einzelnen Tracks: "+cd.tracks);" gar nicht. Ich will, dass er mir nacheinander die einzelnen Lieder auf der Konsole ausgibt. Auf der Konsole erhalte ich "[LCDTrack;@1d667df0" - damit kann ich leider gar nichts anfangen. Muss ich evtl. eine Schleife (for, while) einführen?

Für Ratschläge und Hinweise wäre ich sehr dankbar.

Gruß
lesni
 

chalkbag

Bekanntes Mitglied
Hallo,

zu Codestyles sag ich mal nix, dass wird bestimmt wer Anderes tun.


Implementiere in JEDER Klasse eine toString() Methode

z.b. in CDTrack
Java:
public String toString(){
    return "CDTrack[ Titel: "+this.titel+" Künstler: "+this.kuenstler+" Dauer:"+laengeInSekunden+"]\n";
}

Diese toString kann dir Eclipse übrigens auch automatisch generieren.

Hast du alle toString-Methoden implementiert, dann machst du nur noch System.out.println(Album)
 

xehpuk

Top Contributor
Das Problem befindet sich im Konstruktor von
Code:
CD
:
[JAVA=14]tracks[0].kuenstler = kuenstler;[/code]
Hier weist du dem ersten Track im Array den Künstler der CD zu. Da Instanzvariablen automatisch mit
Code:
null
initialisiert werden, hat im Anschluss also nicht nur die CD keinen Künstler, sondern auch der erste Track. Du musst lediglich die Seiten vertauschen:
[JAVA=14]kuenstler = tracks[0].kuenstler;[/code]

Wie du schon korrekt angemerkt hast, ist eine Schleife nötig, um die einzelnen Elemente eines Arrays auszugeben. Besonders geeignet ist hier die foreach-Schleife:
Java:
for (CDTrack track : cd.tracks) {
    System.out.println(track.kuenstler + " - " + track.titel + " (" + laengeInSekunden + ")");
}

Wie von einem Vorposter schon angemerkt, ist es besser, wenn du sowas in den jeweiligen [c]toString()[/c]-Methoden erledigst (hier von
Code:
CDTrack
):
Java:
public String toString() {
	return kuenstler + " - " + titel + " (" + laengeInSekunden + ")";
}
Dann sieht die Schleife nur noch so aus:
Java:
for (CDTrack track : cd.tracks) {
    System.out.println(track);
}
 

orangata

Mitglied
Dieses
Java:
for (CDTrack track : cd tracks) {
  System.out.println(track);
 }
erscheint in der 8. Zeile von CDTrack, oder?
 

Neue Themen


Oben