OOP Klassen miteinander verbinden

fanta5

Aktives Mitglied
Hallo Forum,

ich schreibe gerade ein kleines Übungsprogramm (soll objektorientiert sein) und stehe vor einem kleinen Problem.

In einer Klasse "Interpreten" habe ich die Instanzvariablen "Name" und "Alter" sowie Getter und Setter notiert.
In einer weiteren Klasse "Songs" habe ich die Instanzvariablen "Titel" und "Erscheinungsjahr" sowie ebenfalls Getter und Setter notiert.

Jetzt möchte ich einem Interpreten z.b. 3 Songs zuordnen. Wie gehe ich da vor?

Ich verstehe den Interpreten als Klasse mit den Eigenschaften Alter und Name.
Und ich verstehe die Klasse Songs mit den Eigenschaften Titel und Erscheinungsjahr.

Aber die Verbindung dieser beiden Klassen bzw. der aus Ihnen entstehenden Objekte ist mir noch nicht ganz klar.

Wer hilft mir da mal auf die Sprünge?

f5
 

Saheeda

Top Contributor
Du fügst dem Interpreten eine Eigenschaft "List<Songs> songs" hinzu.

Ich würde die Klassen ansonsten im Singular bennen. Interpreten michalJackson = new Interpreten() und Songs weWillRockYou = new Songs() ist sonst etwas irreführend. Ist ja jeweils nur ein Sänger und ein Lied, nicht mehrere.
 
Zuletzt bearbeitet:

fanta5

Aktives Mitglied
Du fügst dem Interpreten eine Eigenschaft "List<Songs> songs" hinzu.

Ich würde die Klassen ansonsten im Singular bennen. Interpreten michalJackson = new Interpreten() und Songs weWillRockYou = new Songs() ist sonst etwas irreführend. Ist ja jeweils nur ein Sänger und ein Lied, nicht mehrere.

Danke, der Hinweis, den Singular zu benutzen, ist gut und auch schon umgesetzt.

Den Rest verstehe ich leider nicht ganz. Ich füge dem Interpreten eine Eigenschaft "???" hinzu? Ich verstehe schon den Ausdruck "List<Songs> songs" nicht. Was besagen die spitzen Klammern? Und, meinst Du mit Eigenschaft eine Instanzvariable?

UNd vielleicht ist hilfreich zu wissen, dass ich jedem Interpreten maximal 10 Songs zuweisen möchte?

Gruß, f5
 
Zuletzt bearbeitet:

Saheeda

Top Contributor
Ich meine das so:

Java:
public class Song{

	private String name;
	private int age;
	private List<Song> songs;
}

Es ist eine ganz normale Eigenschaft (oder Instanzvariable, wenn dich das weniger verwirrt), genauso wie Alter oder Name.

List<> ist eine generische Klasse, d.h. du kannst genau festlegen, welche Typen von Daten in diese Liste dürfen.
Eine List<Song> darf nur Objekte vom Typ Song enthalten, List<String> nur Strings und so weiter.
Vorteil ist natürlich, dass bereits beim Hinzufügen eines neuen Elements eine Überprüfung erfolgt, ob das neue Element den richtigen Typ hat. In anderen Sprachen gibt es so etwas nicht, wodurch es passieren kann, dass ein Liste Objekte, Zahlen und Strings enthält und man z.B. sowas produzieren kann:

Code:
stuff = new array();
stuff[0] = "hallo";
stuff[1] = 25;
stuff[2] = new Object();

var sum = stuff[0] + stuff[1] + stuff[2];
sum = ???


Mehr zu Generics hier:
Rheinwerk Computing :: Java ist auch eine Insel - 9 Generics<T>
 
Zuletzt bearbeitet:

fanta5

Aktives Mitglied
Ich meine das so:

Java:
public class Song{

	private String name;
	private int age;
	private List<Song> songs;
}

Es ist eine ganz normale Eigenschaft (oder Instanzvariable, wenn dich das weniger verwirrt), genauso wie Alter oder Name.

Ok. Verstehe.
Bzw. verstehe noch nicht ganz, aber ich verstehe, dass ich so weit in Java noch nicht war. Ich werde mir die Generics anschauen.

Aber ich vermute trotzdem, dass eine Lösung etwas anders gehen sollte, denn in Deiner Lösung wird nichtr berücksichtigt, dass ich max. 10 Songs je Interpret eintragen will.

Könnte es sein, dass für mein Beispiel ein Array ein Rolle spielt?

Ich hatte mal so gedacht:

Code:
public class Interpret {

        private String name;
        private int alter;

	Song songList[] = new Song[10];
	public int songCounter = 0;
	
	// Song dem Interpreten zuordnen:
	public void ordneSongZu(Song song) {
		this.songList[songCounter] = song;
				songCounter++;
	}
        ....
        // Konstruktor, Getter, Setter usw.
}

Aber: Wie stelle ich die Beziehung zwischen Song bzw. mehreren Songs zu dem Interpreten her? Im Grunde fehlt mir die Beziehung bereits beim Counter, denn ich will ja den Counter bereits auf den Interpreten beziehen. Es geht mir auch mehr ium die Idee... der Code ist sicher noch ziemlicher Bullshit...

f5
 
Zuletzt bearbeitet:

Saheeda

Top Contributor
Du erstellst Objekte der Songs und übergibst sie über interpreter.setSong() oder du erlaubst im Konstruktor einen Parameter vom Typ Song.

Java:
public static void main(String[]args){
	Song a = new Song();	

	Interpret interpret = new Interpret();
	interpret.setSong(a);


}

class Interpret{
	
	private Song[] songs = new Song[10];
	
	public void setSongs(Song[]s){
		this.songs = s;
	}	
}

Du kannst natürlich auch ein Array nehmen, wenn dir das lieber ist. Dann musst du aber beim Iterieren über das Array aufpassen:
Jeder Index, an dem sich kein Song-Objekt befindet, enthält "null". Willst du auf ein null zugreifen, wird eine Exception fliegen. Du musst also beim Iterieren prüfen, ob das Element, auf welches du Zugreifen möchtest, null ist oder nicht.
 

fanta5

Aktives Mitglied
Du kannst natürlich auch ein Array nehmen, wenn dir das lieber ist.

Muß nicht, wenn unnötig.
Dein obiger Code ist mir schon recht sympatisch. Was mich irritiert, ist die Main Funktion.
So weit war ich ja noch nicht.
Soll heißen, ich möchte erstmal nur die Klassen Interpret und Song auf mein Vorhaben vorbereiten.

Geht das auch?

f5
 

franky27

Bekanntes Mitglied
Natürlich. Die main zeigt dir ja nur wie du das ganze dann erstellst. Ist aber grundsätzlich kein falscher Ansatz die Grundfunktionen bereits zu testen,
 

fanta5

Aktives Mitglied
Prima.
Und wie lese ich die Songs dann wieder aus, wenn ich einen Interpreten übergebe?

Bitte nicht falsch verstehen, ich habe die Musterlösung für die Aufgabe hier... ich will aber nicht hienein gucken, sondern ich hierzu durcharbeiten, damit etwas mehr hiervon hängen bleibt.

Das ich mich ggf. etwas unbeholfen wirke, hängt damit zusammen, dass ich zum ersten mal 2 Objekte bzw. KJlassen miteinander interagieren lassen will.

f5
 

Saheeda

Top Contributor
Du könntest eine Methode schreiben welche den Titel als Übergabeparameter erhält und das Array oder die Liste danach durchsucht:

Java:
public Song getSongByTitel(String titel){

    for(int i = 0; i<songList.size(); i++){
         if(songList.get(i).titel.equals(titel)){
             return songList.get(i);
         }    
    }
    return null;
}

public List<Song> getSongByPublishingYear(int year){

// to do....

}

Bei der Suche nach dem Erscheinungsjahr würde ich in der Suchmethode eine Liste anlegen und diese zurückgeben. In der Regel erscheint ja pro Jahr nicht nur ein Lied, sondern mehrere.
 

fanta5

Aktives Mitglied
Hallo,

meine Lösung funktioniert nicht ganz:

Code:
public class Interpret {
	// Instanzvariablen:
	private String name;
	private String addresse;
 
	
	private static Song songList[] = new Song[10];
	private static int songListCounter = 0;
	
	// Songs eintragen:
	public void trageSongEin(Song song) {
		songList[songListCounter] = song;
				songListCounter++;
	}
	
	public Song[] getSongs() {
		return songList;
		}

		...

Wenn ich mir nachher eine Liste der Interpreten samt eingetragener Songs ausgeben lasse, stelle ich aber fest, dass dem 2.Interpreten leider auch die Songs des ersten Interpreten zugeordnet wurden :bahnhof:

Deshalb gehe ich davon aus, daß nicht jeder Instanz der Klasse "Interpret" wirklich eine Liste mit je max. 10 Songinstanzen zugeordnet wird.

Kann man aus diesem Codeschnipsel erkennen, warum das so ist?

f5
 
Zuletzt bearbeitet:

Saheeda

Top Contributor
"static" bedeutet, dass alle Instanzen einer Klasse mit denselben Werten arbeiten. Das Song-Array gehört in dem Fall also nicht dem einzelnen Interpreten, sondern allen, die irgendwann irgendwo irgendwie mal von dir definiert werden.
 

fanta5

Aktives Mitglied
"static" bedeutet, dass alle Instanzen einer Klasse mit denselben Werten arbeiten. Das Song-Array gehört in dem Fall also nicht dem einzelnen Interpreten, sondern allen, die irgendwann irgendwo irgendwie mal von dir definiert werden.

Wow, klasse!
Jetzt sitze ich seit 1 Tag daran fest und die Lösung war so easy! Danke, Saheeda!

f5
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Klassen Klassen miteinander Verbinden Java Basics - Anfänger-Themen 19
B Mehrere Klassen miteinander kommunizieren lassen Java Basics - Anfänger-Themen 4
J Zwei Klassen miteinander "verlinken" Java Basics - Anfänger-Themen 9
B Wie kommunizieren Klassen miteinander? (new ...) Java Basics - Anfänger-Themen 10
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
Detlef Bosau Nachladen von Klassen zur Laufzeit Java Basics - Anfänger-Themen 24
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
I 2 verschiedene Klassen mit gleichen Property vergleichen Java Basics - Anfänger-Themen 13
C Array von Klassen Java Basics - Anfänger-Themen 2
monsterherz 2 Klassen daher Probs mit dem Dateinamen Java Basics - Anfänger-Themen 9
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 9
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
S IntelliJ geht alle Klassen durch Java Basics - Anfänger-Themen 9
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
T variablen klassen übergreifend Java Basics - Anfänger-Themen 12
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
D Klassen Klassen Kommunikation Java Basics - Anfänger-Themen 12
Encera Auf Objekte aus anderer Klassen zugreifen Java Basics - Anfänger-Themen 20
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
L Best Practice Annotierte Klassen im Classpath herausfinden Java Basics - Anfänger-Themen 1
P Mit dem Scanner Klassen aufrufen Java Basics - Anfänger-Themen 3
O Klassen Zusammenspiel zwischen 2 Klassen Java Basics - Anfänger-Themen 1
K Zweite Ausgabe von vererbten Klassen Java Basics - Anfänger-Themen 3
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
Speedrunner klassen aufrufen Java Basics - Anfänger-Themen 41
M Log4J (v2) nachträglich in allen Klassen hinzufügen Java Basics - Anfänger-Themen 9
D importieren eigener Klassen Java Basics - Anfänger-Themen 12
W Wo ist der Wurm in meinem Grundverständnis von Klassen? Java Basics - Anfänger-Themen 22
S Daten/Klassen/Packages richtig updaten!? Java Basics - Anfänger-Themen 2
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
elsaaaaaa Wochentag als String ausgeben mit JDK Klassen Java Basics - Anfänger-Themen 6
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
Z Mehtode bei Start des Programms ausführen (Klassen übergreifend) Java Basics - Anfänger-Themen 12
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
TimoN11 Java Klassen Global einbinden Java Basics - Anfänger-Themen 1
B Inventar als einzelne Klassen anlegen? Java Basics - Anfänger-Themen 12
G Java Klassen und Instanzmethoden Java Basics - Anfänger-Themen 15
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 3
T Vererbung Verschiedene Attribute für vererbte Klassen Java Basics - Anfänger-Themen 4
S Klassen instanziieren und verwenden von Getter und Setter Java Basics - Anfänger-Themen 4
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
H Methoden in großen Klassen gruppieren oder auslagern? Java Basics - Anfänger-Themen 10
G Abstrakte Klassen Java Basics - Anfänger-Themen 11
Y Klassen Klassen und Objekte Java Basics - Anfänger-Themen 3
Y Klassen Klassen und Objekte mit set und get Java Basics - Anfänger-Themen 0
A Generischen Klassen Java Basics - Anfänger-Themen 8
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
J 2 klassen benutzen Java Basics - Anfänger-Themen 5
A Klassen und methoden Java Basics - Anfänger-Themen 15
A Bankweverwaltung mit Klassen und Methoden Java Basics - Anfänger-Themen 14
J Klassen Problem Java Basics - Anfänger-Themen 8
I Java Klassen "Graphics" und "MouseEvent" kombinieren Java Basics - Anfänger-Themen 7
I Klassen als Datentyp nutzen? Java Basics - Anfänger-Themen 11
M Aufsplitten von Methoden in andere Klassen Java Basics - Anfänger-Themen 2
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
C Klassen objektorientiert aufteilen Java Basics - Anfänger-Themen 6
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
A Auf Eigenschaften von Objekten anderer Klassen zugreifen Java Basics - Anfänger-Themen 5
F Klassen und Pakete Projektübergreifend (Eclipse) Java Basics - Anfänger-Themen 6
V_Fynn03 Klassen Überweisungen tätigen und einzahlen mit 2 Klassen Java Basics - Anfänger-Themen 1
W Abarbeitungsreihenfolge Anonyme Klassen Java Basics - Anfänger-Themen 2
V_Fynn03 Bruchrechner programmieren (2 Klassen) Java Basics - Anfänger-Themen 9
D OOP- Eine Klasse in mehrere Klassen aufteilen Java Basics - Anfänger-Themen 7
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
E Klassen implementieren Java Basics - Anfänger-Themen 94
T Interfaces in erbenden Klassen Java Basics - Anfänger-Themen 2
C Methoden/Klassen Übergabewerte Java Basics - Anfänger-Themen 8
C Java Klassen/Methoden/Übergabeparameter Java Basics - Anfänger-Themen 4
L Wie geht man bei mehreren Action Klassen vor? Java Basics - Anfänger-Themen 0
P Datentypen, Klassen, Operatoren, Wrapperklassen Java Basics - Anfänger-Themen 2
L Wie teilt man ein Programm in vernünftige Klassen ein? Java Basics - Anfänger-Themen 10
T Klassen Denkfehler im Klassen "dynamisch" instanzieren? Java Basics - Anfänger-Themen 4
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
A Methode, Klassen Java Basics - Anfänger-Themen 3
B UML Klassen Diagramm zu Java Code Programmieren und ausführen Java Basics - Anfänger-Themen 21
J Zwei Klassen die sich gegenseitig referenzieren - Bad practice? Java Basics - Anfänger-Themen 4
G Klassen und Objekte Java Basics - Anfänger-Themen 2
Java The Hutt SetWerte über verschiedene Klassen Java Basics - Anfänger-Themen 16
D Klassen ausgeben Java Basics - Anfänger-Themen 2
H linkedlist generische klassen Java Basics - Anfänger-Themen 169
B CSS Klassen in eine Liste schreiben Java Basics - Anfänger-Themen 4
Queiser Nicht statische Klassen Java Basics - Anfänger-Themen 6
neerual Klassen Wie rufe ich Klassen, die andere Klassen extenden in einer Test Unit auf? Java Basics - Anfänger-Themen 10
J Gleiche Methode in 2 verschiedenen Klassen - Lösung ? Java Basics - Anfänger-Themen 8
G Refactoring von mehreren identischen Klassen Java Basics - Anfänger-Themen 36
O Wrapper Klassen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben