Assoziationen (Beziehungen). Zwischen Objekten kann es eine Beziehung geben.

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

Ein Beispiel in Java.
Funktionen.
Kapselung , toString , equals , Java API
Progwerkstatt JAVA Klasse, Objekte, Konstruktoren, Methoden
Java: Objektorientierte Programmierung
Listen Richard Göbel.
Indirekte Adressierung
Java: Grundlagen der Objektorientierung
Vererbung.
SWITCH - Anweisung.
Abstrakte Klassen.
Klassenvariable (auch Klassendaten bzw. statische Attribute genannt) und statische Methoden.
Wie überwacht man Objekte im "Alltag" ?. Indem man "Wanzen" an diese anbringt.
Ein Beispiel in Java.
Dynamisches Array als "verkettete Liste". Ein Vergleich.
Erweiterte Zuweisungskompatibilität
Objektorientierte Programmierung
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen...
Assoziationen (Beziehungen) 1 : n. Zu einem Auto gibt es mehrere Fahrer (2) und zu diesen 2 Fahrern gibt es genau dieses Auto.
WHILE - Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
Polymorphie (Vielgestaltigkeit)
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
V AdresseWert public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher.
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
Der Präprozessor. Bevor der Compiler das Programm in Maschinencode übersetzt (nur dieser kann von der CPU, dem Herz des Computers, bearbeitet werden)
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
DO...WHILE Anweisung.
ARRAY oder FELD oder VEKTOR
Programmieren mit JAVA
Programmieren mit JAVA
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Programm besteht aus mehreren Bestandteilen: Schlüsselwörter Sonderzeichen Bezeichner Kommentare Texte.
Zusammenfassung Vorwoche
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Einführung in Java1 Einführung in JAVA.
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
05 - Reflection Das Reflection API Reflection2 Ziel Es kommt vor, dass eine Methode ein Objekt als Parameter übergeben bekommt, ohne dass bekannt.
© 2005 Pohlig - Taulien Datenströme GK Informatik 1 Datenströme.
Objektorientierte Modellierung
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Objektorientiertes Konstruieren
Die Klasse String und ihre Methoden
Aufruf einer Methode eines Objektes vom Typ „Bruch“
EPROG Tutorium #3 Philipp Effenberger
Wilfried Imrich CuP - Java Erste Vorlesung Entspricht ungefähr Kapitel 1.1 des Skriptums Wilfried Imrich Montanuniversität Leoben Freitag, 4. Oktober 2002.
Programmiervorkurs WS 2014/15 Instanzmethoden
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
early binding (frühe Bindung) late binding (späte Bindung)
A Workshop About this chapter General description Units Time Schedule
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
Erweiterte Zuweisungskompatibilität. Wie kann man Objekte verschiedener Klassen einer Klassenhierarchie einander zuweisen ?
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Konstruktoren.
Grundkurs Informatik 11-13
Es gibt Klassen, die mit der Entwicklungsumgebung ausgeliefert werden
Ein Referat von Sabrina Vissel, darleen paul und yannick fuchs
 Präsentation transkript:

Assoziationen (Beziehungen)

Zwischen Objekten kann es eine Beziehung geben.

Beispiel

Ein Autonarr steckt sein ganzes Geld in sein (einziges) Auto, mit dem er keinen anderen - außer sich selbst - fahren läßt.

Also: Zu einem Auto gibt es genau einen Fahrer und zu dem Fahrer gibt es genau ein Auto.

In UML wird dies wie folgt dargestellt

AutoFahrer 1 1 Beziehungspfeil; Navigation unidirektional; also nur in eine Richtung: vom Auto zum Fahrer Kardinalitäten (zu einem Auto gibt es einen Fahrer und zu einem Fahrer gibt es ein Auto gehört Leserichtung (optional) Name der Assoziation (optional)

Wie kann dies in Java umgesetzt werden?

Bemerkung: Zwecks übersichtlicher Darstellung werden nicht benutzte get- und set- Methoden weggelassen.

class Auto{ public String kfzZ; public Fahrer f; public void setKfzZeichen( String pKfzZ){ kfzZ = pKfzZ; } Mit diesem Attribut kommt man vom Auto zum Fahrer Kfz-Zeichen Autofahrer

class Fahrer{ public String name; public void setName( String pName){ name = pName; } Da man vom Fahrer nicht zum Auto kommen muss, braucht man auch kein Attribut, mit dem man zum Auto des Fahrers kommt. Name des Fahrers

public class MainAssoziation_1zu1Uni_nr1a{ public static void main(String[] args){ } Fahrer myFahrer = new Fahrer(); Auto myCar = new Auto(); myCar.setKfzZeichen("B-KI 11"); myFahrer.setName("Maier"); myCar.f = myFahrer; System.out.println("Name des Autofahrers=" +myCar.f.name); Wie wird ein Fahrer erzeugt? Wie wird ein Auto erzeugt? Wie bekommt das Auto das KFZ-Zeichen "B-KI 11" ? Wie gibt man (vom Auto ausgehend) den Namen des Fahrers auf dem Bildschirm aus? Wie bekommt der Fahrer den Namen "Maier" ? Wie verlinkt man das Auto mit dem Fahrer?

public class MainAssoziation_1zu1Uni_nr1a{ public static void main(String[] args){ } Fahrer myFahrer = new Fahrer(); Auto myCar = new Auto(); myCar.setKfzZeichen("B-KI 11"); myFahrer.setName("Maier"); myCar.f = myFahrer; System.out.println("Name des Autofahrers=" +myCar.f.name); Warum befindet sich im Design der Klassen Auto und Fahrer ein Verstoß gegen die OOP? Weil die Attribute name, kfzZ und f public sind.

Aufgabe: Schreiben Sie ein Java- Programm, das nicht der OOP widerspricht, (also get- und set- Methoden verwendet) und nur Standard-Konstruktoren besitzt.

Bemerkung: Zwecks übersichtlicher Darstellung werden nicht benutzte get- und set- Methoden weggelassen.

class Auto{ private String kfzZ; private Fahrer f; public void setKfzZeichen( String pKfzZ){ kfzZ = pKfzZ; } public void setFahrer( Fahrer pf){ f = pf; } public Fahrer getFahrer(){ return(f); } // gleich geht es weiter...

public Auto(){ }

class Fahrer{ private String name; public void setName( String pName){ name = pName; } public String getName(){ return(name); } public Fahrer(){ }

public class MainAssoziation_1zu1Uni_nr1b{ public static void main(String[] args) } Fahrer myFahrer = new Fahrer(); Auto myCar = new Auto(); myFahrer.setName("Maier"); myCar.setKfzZeichen("B-KI 11"); myCar.setFahrer(myFahrer); System.out.println("Name des Autofahrers=" +myCar.getFahrer().getName()); Wie wird ein Fahrer erzeugt? Wie wird ein Auto erzeugt? Wie bekommt das Auto das KFZ-Zeichen "B-KI 11" ? Wie gibt man (vom Auto ausgehend) den Namen des Fahrers auf dem Bildschirm aus? Wie bekommt der Fahrer den Namen "Maier" ? Wie verlinkt man das Auto mit dem Fahrer?

public class MainAssoziation_1zu1Uni_nr1b{ public static void main(String[] args) } Fahrer myFahrer = new Fahrer(); Auto myCar = new Auto(); myFahrer.setName("Maier"); myCar.setKfzZeichen("B-KI 11"); myCar.setFahrer(myFahrer); System.out.println("Name des Autofahrers=" +myCar.getFahrer().getName()); Welche besondere Methode könnte man auch noch in der Klasse Auto bzw. Fahrer implementieren? Die Konstruktoren!

Aufgabe: Schreiben Sie ein Java- Programm, das get- und set- Methoden verwendet und Konstruktoren (keine Standard- Konstruktoren) besitzt.

Bemerkung: Zwecks übersichtlicher Darstellung werden nicht benutzte get- und set- Methoden weggelassen.

class Auto{ private String kfzZ; private Fahrer f; public Auto(String pKfzZ, Fahrer pf){ kfzZ = pKfzZ; f = pf; } public Fahrer getFahrer(){ return(f); }

class Fahrer{ private String name; public Fahrer(String pName){ name = pName; } public String getName(){ return(name); }

public class MainAssoziation_1zu1Uni_nr1 { public static void main(String[] args){ } Wie gibt man (vom Auto ausgehend) den Namen des Fahrers auf dem Bildschirm aus? System.out.println("Name des Autofahrers=" +myCar.getFahrer().getName()); Auto myCar = new Auto("B-KI 11", myFahrer); Wie wird ein Auto mit KFZ-Zeichen "B-KI 11" erzeugt und gleichzeitig mit dem obigen Fahrer verlinkt? Fahrer myFahrer = new Fahrer("Maier"); Wie wird ein Fahrer mit Namen "Maier" erzeugt?

public class MainAssoziation_1zu1Uni_nr1 { public static void main(String[] args){ } System.out.println("Name des Autofahrers=" +myCar.getFahrer().getName()); Auto myCar = new Auto("B-KI 11", myFahrer); Fahrer myFahrer = new Fahrer("Maier"); Der Fahrer wird in der Methode main(...) erzeugt. Wo könnte er auch noch erzeugt werden? Bei der Erzeugung eines Autos, also im Konstruktor von Auto.

Aufgabe: Schreiben Sie ein Java- Programm, das den Fahrer nicht in main(...) erzeugt.

class Auto{ private String kfzZ; private Fahrer f; public Auto(String pKfzZ, String pName){ kfzZ = pKfzZ; f = new Fahrer(pName); } public Fahrer getFahrer(){ return(f); } Im Konstruktor von Auto wird ein Fahrer erzeugt.

class Fahrer{ private String name; public Fahrer(String pName){ name = pName; } public String getName(){ return(name); } hier ändert sich nichts

public class MainAssoziation_1zu1Uni_nr1 { public static void main(String[] args){ } Der Fahrer wird nicht in der Methode main(...) erzeugt, sondern im Konstruktor Auto(...). Auto myCar = new Auto("B-KI 11", "Maier"); Wie wird ein Auto erzeugt? System.out.println("Name des Autofahrers =" +myCar.getFahrer().getName()); Wie gibt man (vom Auto ausgehend) den Namen des Fahrers auf dem Bildschirm aus? Wie wird ein Auto mit KFZ-Zeichen "B-KI 11" erzeugt, das von "Maier" gefahren wird ?

Komplette Darstellung in UML

AutoFahrer 1 1 Beziehungspfeil; Navigation unidirektional; also nur in eine Richtung: vom Auto zum Fahrer Kardinalitäten (zu einem Auto gibt es einen Fahrer und zu einem Fahrer gibt es ein Auto gehört Leserichtung (optional) Name der Assoziation (optional) f Rollennamen. Ein Rollenname kann auch weggelassen werden. Dann muss er aber im UML in der Liste der Attribute notiert werden.

Es soll das gleiche Programm wie vorher realisiert werden, nur mit einer Navigation in alle zwei Richtungen (bidirektional), wobei die Verlinkung der 2 Objekte durch Direktzugriff auf die public Attribute erfolgt. Vorher noch eine Frage...

Warum braucht man eine Navigation in zwei Richtungen ? Es reicht doch, wenn man von einem Ausgangspunkt überall hin kommt.

In manchen Fällen (siehe GUI und Listener) kommt man nicht immer an einen Ausgangspunkt: Man kann von main aus auf ein Fenster und darin auf eine Wanze (Listener) zugreifen. Doch bei einem Mausklick muss man von der Wanze ausgehend auf das Fenster zugreifen.

Bidirektionale Darstellung in UML

AutoFahrer 1 1 Navigation birektional; also in zwei Richtungen: vom Auto zum Fahrer und vom Fahrer zum Auto Manchmal wird in UML bidirektional durch einen Pfeil mit 2 Pfeilspitzen dargestellt. Alles ist gleich wie vorher, außer der Bidirektionalität

Wie kann dies in Java umgesetzt werden?

class Auto{ public String kfzZ; public Fahrer f; public void setKfzZeichen( String pKfzZ){ kfzZ = pKfzZ; } Mit diesem Attribut kommt man vom Auto zum Fahrer

class Fahrer{ public String name; public Auto a; public void setName( String pName){ name = pName; } Mit diesem Attribut kommt man vom Fahrer zum Auto

public class MainAssoziation_1zu1Bi_nr1a{ public static void main(String[] args) } Fahrer myFahrer = new Fahrer(); Auto myCar = new Auto(); myCar.setKfzZeichen("B-KI 11"); myFahrer.setName("Maier"); myCar.f = myFahrer; myFahrer.a = myCar; Wie wird ein Fahrer erzeugt? Wie wird ein Auto erzeugt? Wie bekommt der Fahrer den Namen "Maier" ? Wie verlinkt man den Fahrer mit dem Auto ? Wie bekommt das Auto das KFZ-Zeichen "B-KI 11" ? Wie verlinkt man das Auto mit dem Fahrer?

public class MainAssoziation_1zu1Bi_nr1a{ public static void main(String[] args) } Fahrer myFahrer = new Fahrer(); Auto myCar = new Auto(); myCar.setKfzZeichen("B-KI 11"); myFahrer.setName("Maier"); myCar.f = myFahrer; myFahrer.a = myCar; Wie gibt man (vom Auto ausgehend) den Namen des Fahrers auf dem Bildschirm aus? Wie gibt man (vom Fahrer ausgehend) das Kfz-Zeichen des Autos auf dem Bildschirm aus? System.out.println("Name des Autofahrers=" +myCar.f.name); System.out.println("K-Zeichen des Fahrers=" +myFahrer.a.kfzZ);

public class MainAssoziation_1zu1Bi_nr1a { public static void main(String[] args){ Fahrer myFahrer = new Fahrer(); Auto myCar = new Auto(); myFahrer.setName("Maier"); myCar.setKfzZeichen("B-KI 11"); myCar.f = myFahrer; myFahrer.a = myCar; Was geben die folgenden Anweisungen auf dem Bildschirm aus? System.out.println(myCar.f.a.name); } System.out.println(myCar.f.a.kfzZ); syntaktisch falsch: Auto hat kein Attribut name System.out.println(myCar.f.a.f.name); System.out.println(myCar.f.a.f.a.kfzZ); Kfz-Zeichen des Autos: "B-KI 11" Name des Autofahrers: "Maier" Kfz-Zeichen des Autos: "B-KI 11" System.out.println(myCar.kfzZ); System.out.println(myFahrer.a.f.a.f.name); Kfz-Zeichen des Autos: "B-KI 11" Name des Autofahrers: "Maier" System.out.println(myFahrer.name); Name des Autofahrers: "Maier"

public class MainAssoziation_1zu1Bi_nr1a { public static void main(String[] args){ Fahrer myFahrer = new Fahrer(); Auto myCar = new Auto(); myFahrer.setName("Maier"); myCar.setKfzZeichen("B-KI 11"); myCar.f = myFahrer; myFahrer.a = myCar; System.out.println(myCar.f.a.name); } System.out.println(myCar.f.a.kfzZ); System.out.println(myCar.f.a.f.name); System.out.println(myCar.f.a.f.a.kfzZ); System.out.println(myCar.kfzZ); System.out.println(myFahrer.a.f.a.f.name); Warum befindet sich im Design der Klassen Auto und Fahrer ein Verstoß gegen die OOP? Weil die Attribute name, kfzZ, a und f public sind.

Aufgabe: Schreiben Sie ein Java- Programm, das nicht der OOP widerspricht, (also get- und set- Methoden verwendet) und nur Standard-Konstruktoren besitzt.

Bemerkung: Zwecks übersichtlicher Darstellung werden nicht benutzte get- und set- Methoden weggelassen.

class Auto{ private String kfzZ; private Fahrer f; public Auto(){ } public void setKfzZeichen(String pKfzZ){ kfzZ = pKfzZ; } public String getKfzZeichen(){ return(kfzZ); } public void setFahrer(Fahrer pf){ f = pf; } public Fahrer getFahrer(){ return(f); } Mit diesem Attribut kommt man vom Auto zum Fahrer

class Fahrer{ private String name; private Auto a; public Fahrer(){ } public void setName(String pName){ name = pName; } public String getName(){ return(name); } public void setAuto(Auto pa){ a = pa; } public Auto getAuto(){ return(a); } Mit diesem Attribut kommt man vom Fahrer zum Auto

public class MainAssoziation_1zu1Bi_nr1a{ public static void main(String[] args) } Fahrer myFahrer = new Fahrer(); Auto myCar = new Auto(); myCar.setKfzZeichen("B-KI 11"); myFahrer.setName("Maier"); myCar.setFahrer(myFahrer); myFahrer.setAuto(myCar); Wie wird ein Fahrer erzeugt? Wie wird ein Auto erzeugt? Wie bekommt der Fahrer den Namen "Maier" ? Wie verlinkt man den Fahrer mit dem Auto ? Wie bekommt das Auto das KFZ-Zeichen "B-KI 11" ? Wie verlinkt man das Auto mit dem Fahrer?

public class MainAssoziation_1zu1Bi_nr1a{ public static void main(String[] args) } Fahrer myFahrer = new Fahrer(); Auto myCar = new Auto(); myCar.setKfzZeichen("B-KI 11"); myFahrer.setName("Maier"); myCar.setFahrer(myFahrer); myFahrer.setAuto(myCar); Wie gibt man (vom Auto ausgehend) den Namen des Fahrers auf dem Bildschirm aus? Wie gibt man (vom Fahrer ausgehend) das Kfz-Zeichen des Autos auf dem Bildschirm aus? System.out.println("Name des Autofahrers=" +myCar.f.name); System.out.println("K-Zeichen des Fahrers=" +myFahrer.a.kfzZ);

public class MainAssoziation_1zu1Bi_nr1a{ public static void main(String[] args) } Fahrer myFahrer = new Fahrer(); Auto myCar = new Auto(); myCar.setKfzZeichen("B-KI 11"); myFahrer.setName("Maier"); myCar.setFahrer(myFahrer); myFahrer.setAuto(myCar); System.out.println("Name des Autofahrers=" +myCar.f.name); System.out.println("K-Zeichen des Fahrers=" +myFahrer.a.kfzZ); Welche besondere Methode könnte man auch noch in der Klasse Auto bzw. Fahrer implementieren? Die Konstruktoren!

Aufgabe: Schreiben Sie ein Java- Programm, das get- und set- Methoden verwendet und Konstruktoren (keine Standard- Konstruktoren) besitzt.

Bemerkung: Zwecks übersichtlicher Darstellung werden nicht benutzte get- und set- Methoden weggelassen.

class Auto{ private String kfzZ; private Fahrer f; public Auto(String pKfzZ, Fahrer pf){ kfzZ = pKfzZ; f = pf; } public String getKfzZeichen(){ return(kfzZ); } public Fahrer getFahrer(){ return(f); } Mit diesem Attribut kommt man vom Auto zum Fahrer

class Fahrer{ private String name; private Auto a; public Fahrer(String pName){ name = pName; } public String getName(){ return(name); } public void setAuto(Auto pa){ a = pa; } public Auto getAuto(){ return(a); } Mit diesem Attribut kommt man vom Fahrer zum Auto.

public class MainAssoziation_1zu1Bi_nr1a{ public static void main(String[] args) } Fahrer myFahrer = new Fahrer("Maier"); Auto myCar = new Auto("B-KI 11", myFahrer); myFahrer.setAuto(myCar); System.out.println("Name des Autofahrers=" +myCar.getFahrer().getName()); Wie wird ein Fahrer mit Name "Maier" erzeugt? Wie wird ein Auto mit KFZ-Zeichen "B-KI 11" erzeugt und gleichzeitig mit dem obigen Fahrer verlinkt? Wie wird der obige Fahrer mit obigem Auto verlinkt? Wie gibt man (vom Auto ausgehend) den Namen des Fahrers auf dem Bildschirm aus?

public class MainAssoziation_1zu1Bi_nr1a{ public static void main(String[] args) } Fahrer myFahrer = new Fahrer("Maier"); Auto myCar = new Auto("B-KI 11", myFahrer); myFahrer.setAuto(myCar); System.out.println("Name des Autofahrers=" +myCar.getFahrer().getName()); System.out.println("K-Zeichen des Fahrers" myFahrer.getAuto().getKfzZeichen()); Wie gibt man (vom Fahrer ausgehend) das Kfz-Zeichen des Autos auf dem Bildschirm aus?

Statt den Konstruktor Auto mit 2 Parametern und den Konstruktor Fahrer mit einem Parameter, könnte man genau so gut...

... den Konstruktor Auto mit 1 Parameter und den Konstruktor Fahrer mit 2 Parametern implementieren. Realisieren Sie dies in einem Java-Programm

class Auto{ private String kfzZ; private Fahrer f; public Auto(String pKfzZ){ kfzZ = pKfzZ; } public String getKfzZeichen(){ return(kfzZ); } public Fahrer getFahrer(){ return(f); } public void setFahrer(Fahrer pf){ f = pf; } Mit diesem Attribut kommt man vom Auto zum Fahrer

class Fahrer{ private String name; private Auto a; public Fahrer(String pName, Auto pa){ name = pName; a = pa; } public String getName(){ return(name); } public Auto getAuto(){ return(a); } Mit diesem Attribut kommt man vom Fahrer zum Auto.

public class MainAssoziation_1zu1Bi_ver4 { public static void main(String[] args){ } Auto myCar = new Auto("B-KI 11"); Fahrer myFahrer = new Fahrer("Maier", myCar); myCar.setFahrer(myFahrer); System.out.println("Name des Autofahrers=" +myCar.getFahrer().getName()); Wie wird ein Auto mit KFZ-Zeichen "BKI-11" erzeugt? Wie wird ein Fahrer mit Name "Maier" erzeugt und gleichzeitig mit dem obigen Auto verlinkt? Wie wird das obige Auto mit obigem Fahrer verlinkt? Wie gibt man (vom Auto ausgehend) den Namen des Fahrers auf dem Bildschirm aus?

public class MainAssoziation_1zu1Bi_ver4 { public static void main(String[] args){ } Auto myCar = new Auto("B-KI 11"); Fahrer myFahrer = new Fahrer("Maier", myCar); myCar.setFahrer(myFahrer); System.out.println("Name des Autofahrers=" +myCar.getFahrer().getName()); System.out.println("KF-Zeichen des Fahrers" +myFahrer.getAuto().getKfzZeichen()); Wie gibt man (vom Fahrer ausgehend) das Kfz-Zeichen des Autos auf dem Bildschirm aus?

Ist der folgende Versuch auch eine Lösung?

class Auto{ //... public Auto(String pKfzZ, Fahrer pf){ kfzZ = pKfzZ; f = pf; } //... } class Fahrer{ //... public Fahrer(String pName, Auto pa){ name = pName; a = pa } //... } Warum kann man den Konstruktor von Fahrer nicht analog dem Konstruktor von Auto implementieren und dann...

public class MainAssoziation_1zu1Bi_nr1b{ public static void main(String[] args){ Fahrer myFahrer = new Fahrer("Maier", myCar); Auto myCar = new Auto("B-KI 11", myFahrer); //... }... in main(...) das Auto und den Fahrer wie folgt anlegen? Weil an dieser Stelle das Objekt myCar noch gar nicht existiert.

Gibt es nicht doch eine Lösung mit jeweils einem Konstruktor mit 2 Parametern?

class Auto{ private String kfzZ; private Fahrer f; public Auto(String pKfzZ, Fahrer pf){ kfzZ = pKfzZ; f = pf; } public String getKfzZeichen(){ return(kfzZ); } public Fahrer getFahrer(){ return(f); } public void setFahrer(Fahrer pf){ f = pf; } Wie gehabt: Der Konstruktor von Auto hat 2 Parameter.

class Fahrer{ private String name; private Auto a; public Fahrer(String pName, Auto pa){ name = pName; a = pa; } public String getName(){ return(name); } public Auto getAuto(){ return(a); } Auch der Konstruktor von Fahrer hat 2 Parameter.

public class MainAssoziation_1zu1Bi_ver4 { public static void main(String[] args){ } Fahrer myFahrer = null; Auto myCar = new Auto("B-KI 11", myFahrer); myFahrer = new Fahrer("Maier", myCar); myCar.setFahrer(myFahrer); Wie kann man einen Link auf einen Fahrer (hier Fahrerlink genannt) erzeugen, der noch auf keinen Fahrer zeigt ? Wie wird das Auto mit KFZ-Zeichen "B-KI 11" erzeugt und gleichzeitig mit dem obigen Fahrerlink verlinkt? Wie wird ein Fahrer mit Name "Maier" erzeugt, so daß obiger Fahrerlink auf ihn zeigt und der Fahrer gleichzeitig mit obigem Auto verlinkt wird? Wie wird das Auto mit dem eben erzeugten Fahrer verlinkt ?

public class MainAssoziation_1zu1Bi_ver4 { public static void main(String[] args){ } Fahrer myFahrer = null; Auto myCar = new Auto("B-KI 11", myFahrer); myFahrer = new Fahrer("Maier", myCar); myCar.setFahrer(myFahrer); System.out.println("Name des Autofahrers=" +myCar.getFahrer().getName()); System.out.println("KF-Zeichen des Fahrers" +myFahrer.getAuto().getKfzZeichen()); Wie gibt man (vom Auto ausgehend) den Namen des Fahrers auf dem Bildschirm aus? Wie gibt man (vom Fahrer ausgehend) das Kfz-Zeichen des Autos auf dem Bildschirm aus? Ist nun alles richtig verlinkt, oder fehlt noch etwas? Schauen wir uns die bisherige Verlinkung an...

Bemerkung: Im Folgenden werden Daten im Arbeitsspeicher wie folgt dargestellt:

myHund AdresseWert Adresse im Arbeitsspeicher Wert (Inhalt) dieser Adresse (z.B. Gewicht eines Hundes) Symbolische Beschreibung durch eine Variable Zwecks Platzersparnis werden diese Bezeichnungen im Folgenden weggelassen. Annahme: Die Adresse ist Die weiteren folgenden Adressen sind alle auch beliebig gewählt. Auf diese Adressen hat der Programmierer keinen Einfluss, sondern die JVM und der Programmlader.

Fahrer myFahrer = null; myFahrer 0100 Was bewirkt diese Anweisung im Arbeitsspeicher? null

Auto myCar = new Auto("B-KI 11", myFahrer); Fahrer myFahrer = null; Was bewirkt diese Anweisung im Arbeitsspeicher? myCar Objekt myCar null kfzZ f 0400 B-KI Im Konstruktor Auto(...) wird der Wert von myFahrer (also null) in das Attribut f kopiert. null Warum bekommt f welchen Wert zugewiesen? Wie wird myCar mit dem Objekt verlinkt? myFahrer

Auto myCar = new Auto("B-KI 11", myFahrer); Fahrer myFahrer = null; myFahrer myCar Objekt myCar null kfzZ f 0400 B-KI Objekt myFahrer 0200 Maier... myFahrer = new Fahrer("Maier", myCar); null Wie wird myFahrer mit dem Objekt verlinkt? Was bewirkt diese Anweisung im Arbeitsspeicher?

Auto myCar = new Auto("B-KI 11", myFahrer); Fahrer myFahrer = null; myFahrer myCar Objekt myCar null kfzZ f 0400 B-KI Objekt myFahrer 0200 Maier... myFahrer = new Fahrer("Maier", myCar); Wie wird myFahrer mit dem Objekt verlinkt? 0200

Auto myCar = new Auto("B-KI 11", myFahrer); Fahrer myFahrer = null; myFahrer myCar Objekt myCar null kfzZ f 0400 B-KI Objekt myFahrer 0200 Maier name a myFahrer = new Fahrer("Maier", myCar); Warum bekommt a welchen Wert zugewiesen? Im Konstruktor Fahrer(...) wird der Wert von myCar (also 0400) in das Attribut a kopiert. 0200

Auto myCar = new Auto("B-KI 11", myFahrer); Fahrer myFahrer = null; myFahrer myCar Objekt myCar null kfzZ f Objekt myFahrer 0200 Maier name a myFahrer = new Fahrer("Maier", myCar); Auf welches Objekt zeigt also das Attribut a des erstellten Objekts myFahrer? 0400 B-KI

Auto myCar = new Auto("B-KI 11", myFahrer); Fahrer myFahrer = null; myFahrer Was bewirkt diese Anweisung im Arbeitsspeicher? myCar Objekt myCar null kfzZ f Objekt myFahrer 0200 Maier name a myFahrer = new Fahrer("Maier", myCar); myCar.setFahrer(myFahrer); In der Methode setFahrer(...) wird der Wert von myFahrer (also 0200) in das Attribut f kopiert. Warum bekommt f welchen Wert zugewiesen? B-KI 11...

Auto myCar = new Auto("B KI 11", myFahrer); Fahrer myFahrer = null; myFahrer myCar Objekt myCar 0200 kfzZ f Objekt myFahrer 0200 Maier name a myFahrer = new Fahrer("Maier", myCar); myCar.setFahrer(myFahrer); B-KI Auf welches Objekt zeigt also das Attribut f des erstellten Objekts myCar?

public class MainAssoziation_1zu1Bi_ver5 { public static void main(String[] args){ Fahrer myFahrer = null; myCar.setFahrer(myFahrer); System.out.println("Name des Autofahrers=" +myCar.getFahrer().getName()); System.out.println("KF-Zeichen des Fahrers" +myFahrer.getAuto().getKfzZeichen()); } myFahrer = new Fahrer("Maier", myCar); Auto myCar = new Auto("ES LE 40", myFahrer); Der Fahrer und das Auto wird in der Methode main(...) erzeugt. Wo könnte er auch noch erzeugt werden? Bei der Erzeugung eines Autos, also im Konstruktor von Auto.

Aufgabe: Schreiben Sie ein Java- Programm, das das Auto in main(...) und den Fahrer im Konstruktor von Auto erzeugt.

class Fahrer{ private String name; private Auto a; public Fahrer(String pName, Auto pa){ name = pName; a = pa; } pName wird in name kopiert pa wird in a kopiert

class Auto{ private String kfzZ; private Fahrer f; public Auto(String pKfzZ, String pName){ kfzZ = pKfzZ; f = new Fahrer(pName,....); } Auto myCar = new Auto("B-KI 11","Maier"); Was geschieht in main(...) bei folgender Anweisung?

class Auto{ //... public Auto(String pKfzZ, String pName){ kfzZ = pKfzZ; f = new Fahrer(pName,....); } Auto myCar = new Auto("B-KI 11","Maier"); Aus Platzgründen Teile des Quellcodes weggelassen 0300 myCar Objekt myCar kfzZ f 0400 B-KI Welcher Wert muss hier eingetragen werden? 0400 Was veranlasst diese Anweisung? Anlegen des folgenden Objekts...

class Auto{ //... public Auto(String pKfzZ, String pName){ kfzZ = pKfzZ; f = new Fahrer(pName,....); } Auto myCar = new Auto("B-KI 11","Maier"); 0300 myCar Objekt myCar kfzZ f 0400 B-KI Maier... name a Wie wird dieses gerade angelegte Objekt mit f verlinkt?

class Auto{ //... public Auto(String pKfzZ, String pName){ kfzZ = pKfzZ; f = new Fahrer(pName,....); } Auto myCar = new Auto("B-KI 11","Maier"); 0300 myCar Objekt myCar kfzZ f 0400 B-KI Maier... name a Wie wird dieses gerade angelegte Objekt mit f verlinkt? 0200

class Auto{ //... public Auto(String pKfzZ, String pName){ kfzZ = pKfzZ; f = new Fahrer(pName,....); } Auto myCar = new Auto("B-KI 11","Maier"); 0300 myCar Objekt myCar kfzZ f 0400 B-KI Maier... name a Jetzt wurden zwar im Konstruktor der Klasse Auto ein Fahrer angelegt, aber... Es fehlt die Verlinkung vom Fahrer zum Auto Wie wird dies erreicht? 0200

class Auto{ //... public Auto(String pKfzZ, String pName){ kfzZ = pKfzZ; f = new Fahrer(pName,....); } Auto myCar = new Auto("B-KI 11","Maier"); 0300 myCar Objekt myCar kfzZ f 0400 B-KI Maier... name a Welche Information benötigt der Konstruktor noch, damit er auf das Auto zeigen kann? Das Auto selbst, also konkret myCar. Warum funktioniert das nicht? myCar Weil im Bauplan nicht schon der Name des Objekts stehen kann, das irgendein Programmierer später (nach der Erstellung des Bauplans) dem Objekt beim Anlegen mit new.. vergibt! Der Zugriff innerhalb einer Methode eines Objekts auf das Objekt selbst geschieht mit dem Bezeichner this. In dem Fall hier wird mit this das Objekt myCar an den Parameter desKonstrutors von myFahrer übergeben. 0200

class Auto{ //... public Auto(String pKfzZ, String pName){ kfzZ = pKfzZ; f = new Fahrer(pName,....); } Auto myCar = new Auto("B-KI 11","Maier"); 0300 myCar Objekt myCar kfzZ f 0400 B-KI Maier... name a this 0400 Was bewirkt dies hier konkret im Arbeitsspeicher? Im Konstruktor von Fahrer(...) wird der Wert von myCar (also 0400) in das Attribut a kopiert. 0200

class Auto{ //... public Auto(String pKfzZ, String pName){ kfzZ = pKfzZ; f = new Fahrer(pName,....); } Auto myCar = new Auto("B-KI 11","Maier"); 0300 myCar Objekt myCar kfzZ f 0400 B-KI Maier... name a this 0400 Auf welches Objekt zeigt also das Attribut f des erstellten Objekts myCar? Auf welches Objekt zeigt also das Attribut a des erstellten Fahrers? 0200

Aufgabe: Schreiben Sie ein Java- Programm, das ein Auto und einen Fahrer in einer bidirektionalen Assoziation mit der Methode verlinke(...) wie folgt verlinkt (siehe Beispiel nächste Folie).

package temptest1; public class MainTempTest1 { public static void main(String[] args) { Auto myAuto = new Auto("B-KI 1"); Fahrer myFahrer = new Fahrer("Maier"); myAuto.verlinke(myFahrer); // alternativ // myFahrer.verlinke(myAuto); myAuto.printAttributs(); myFahrer.printAttributs(); myAuto.getFahrer().printAttributs(); myFahrer.getAuto().printAttributs(); }

Aufgabe: Schreiben Sie die Klassen Auto und Fahrer mit den entsprechenden get und set-Methoden und der Methode verlinke(...)

class Auto{ private String kfzZ; private Fahrer f; public Auto(String pKfzZ){ kfzZ=pKfzZ; } Fahrer getFahrer(){ return f; } public void setFahrer(Fahrer pFahrer){ f = pFahrer; } public void verlinke(Fahrer pF){ setFahrer(pF); f.setAuto(this); } void printAttributs(){ System.out.println("kfzZ="+kfzZ); }

class Fahrer{ private String name; private Auto a; public Fahrer(String pName){ name=pName; } Auto getAuto(){ return a; } public void setAuto(Auto pA){ a = pA; } public void verlinke(Auto pA){ setAuto(pA); a.setFahrer(this); } void printAttributs(){ System.out.println("name="+name); }