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

97
Assoziationen (Beziehungen)

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

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

Assoziationen (Beziehungen)

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

Zwischen Objekten kann es eine Beziehung

geben.

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

Beispiel

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

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

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

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

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

In UML wird dies wie folgt dargestellt

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

Auto Fahrer 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)

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

Wie kann dies in Java umgesetzt werden?

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

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

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

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

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

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

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

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?

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

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.

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

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

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

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

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

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 ...

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

public Auto(){ }

}

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

class Fahrer{ private String name;

public void setName( String pName){ name = pName; }

public String getName(){ return(name); }

public Fahrer(){ }

}

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

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?

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

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!

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

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

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

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

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

class Auto{ private String kfzZ; private Fahrer f;

public Auto(String pKfzZ, Fahrer pf){ kfzZ = pKfzZ; f = pf; }

public Fahrer getFahrer(){ return(f); }}

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

class Fahrer{ private String name;

public Fahrer(String pName){ name = pName; }

public String getName(){ return(name); }}

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

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?

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

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.

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

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

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

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.

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

class Fahrer{ private String name;

public Fahrer(String pName){ name = pName; }

public String getName(){ return(name); }}

hier ändert sich nichts

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

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");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 ?

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

Komplette Darstellung in UML

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

Auto Fahrer 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.

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

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 ...

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

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

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

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.

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

Bidirektionale Darstellung in UML

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

Auto Fahrer 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

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

Wie kann dies in Java umgesetzt werden?

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

class Auto{ public String kfzZ; public Fahrer f;

public void setKfzZeichen( String pKfzZ){ kfzZ = pKfzZ; }}

Mit diesem Attribut kommt man vom Auto zum Fahrer

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

class Fahrer{ public String name; public Auto a;

public void setName( String pName){ name = pName; }}

Mit diesem Attribut kommt man vom Fahrer zum Auto

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

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?

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

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);

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

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"

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

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.

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

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

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

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

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

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

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

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

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

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?

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

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);

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

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!

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

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

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

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

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

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

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

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.

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

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?

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

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?

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

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

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

... den Konstruktor Auto mit 1 Parameter und den Konstruktor Fahrer mit 2 Parametern implementieren.

Realisieren Sie dies in einem Java-Programm

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

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

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

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.

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

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?

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

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?

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

Ist der folgende Versuch auch eine

Lösung?

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

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 ...

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

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.

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

Gibt es nicht doch eine Lösung mit jeweils

einem Konstruktor mit 2 Parametern?

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

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.

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

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.

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

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 ?

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

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 ...

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

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

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

myHund

Adresse Wert

0100 123

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 0100.Die weiteren folgenden Adressen sind alle auch beliebig gewählt.Auf diese Adressen hat der Programmierer keinen Einfluss, sondern die JVM und der Programmlader.

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

Fahrer myFahrer = null;

myFahrer 0100

Was bewirkt diese Anweisung im Arbeitsspeicher?

null

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

Auto myCar = new Auto("B-KI 11", myFahrer);

Fahrer myFahrer = null;

0100 0300 0400

Was bewirkt diese Anweisung im Arbeitsspeicher?

myCar

Objekt myCar

null

kfzZ

f

0400 B-KI 11

...

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

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

Auto myCar = new Auto("B-KI 11", myFahrer);

Fahrer myFahrer = null;

myFahrer 0100 0300 0400myCar

Objekt myCar

null

kfzZ

f

0400 B-KI 11

...

Objekt myFahrer

0200 Maier

...

myFahrer = new Fahrer("Maier", myCar);

null

Wie wird myFahrer mit dem Objekt verlinkt?

Was bewirkt diese Anweisung im Arbeitsspeicher?

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

Auto myCar = new Auto("B-KI 11", myFahrer);

Fahrer myFahrer = null;

myFahrer 0100 0300 0400myCar

Objekt myCar

null

kfzZ

f

0400 B-KI 11

...

Objekt myFahrer

0200 Maier

...

myFahrer = new Fahrer("Maier", myCar);

Wie wird myFahrer mit dem Objekt verlinkt?

0200

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

Auto myCar = new Auto("B-KI 11", myFahrer);

Fahrer myFahrer = null;

myFahrer 0100 0300 0400myCar

Objekt myCar

null

kfzZ

f

0400 B-KI 11

...

Objekt myFahrer

0200 Maier

... 0400

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

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

Auto myCar = new Auto("B-KI 11", myFahrer);

Fahrer myFahrer = null;

myFahrer 0100 0300 0400myCar

Objekt myCar

null

kfzZ

f

Objekt myFahrer

0200 Maier

... 0400

name

a

myFahrer = new Fahrer("Maier", myCar);

Auf welches Objekt zeigt also das Attribut a des erstellten Objekts myFahrer?

0400 B-KI 11

...

0200

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

Auto myCar = new Auto("B-KI 11", myFahrer);

Fahrer myFahrer = null;

myFahrer 0100 0300 0400

Was bewirkt diese Anweisung im Arbeitsspeicher?

myCar

Objekt myCar

null

kfzZ

f

Objekt myFahrer

0200 Maier

... 0400

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?

0200

0400 B-KI 11

...

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

Auto myCar = new Auto("B KI 11", myFahrer);

Fahrer myFahrer = null;

myFahrer 0100 0300 0400myCar

Objekt myCar

0200

kfzZ

f

Objekt myFahrer

0200 Maier

... 0400

name

a

myFahrer = new Fahrer("Maier", myCar);myCar.setFahrer(myFahrer);

0200

0400 B-KI 11

...Auf welches Objekt zeigt also das Attribut f des erstellten Objekts myCar?

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

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.

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

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

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

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

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

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?

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

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

0300myCar

Objekt myCar

kfzZ

f

0400 B-KI 11

...

Welcher Wert muss hier eingetragen werden?

0400Was veranlasst diese Anweisung?

Anlegen des folgenden Objekts...

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

class Auto{ //... public Auto(String pKfzZ, String pName){ kfzZ = pKfzZ; f = new Fahrer(pName, ....); }}Auto myCar = new Auto("B-KI 11","Maier");

0300myCar

Objekt myCar

kfzZ

f

0400 B-KI 11

...

0400

0200 Maier

...

name

a

Wie wird dieses gerade angelegte Objekt mit f verlinkt?

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

class Auto{ //... public Auto(String pKfzZ, String pName){ kfzZ = pKfzZ; f = new Fahrer(pName, ....); }}Auto myCar = new Auto("B-KI 11","Maier");

0300myCar

Objekt myCar

kfzZ

f

0400 B-KI 11

...

0400

0200 Maier

...

name

a

Wie wird dieses gerade angelegte Objekt mit f verlinkt?

0200

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

class Auto{ //... public Auto(String pKfzZ, String pName){ kfzZ = pKfzZ; f = new Fahrer(pName, ....); }}Auto myCar = new Auto("B-KI 11","Maier");

0300myCar

Objekt myCar

kfzZ

f

0400 B-KI 11

...

0400

0200 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

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

class Auto{ //... public Auto(String pKfzZ, String pName){ kfzZ = pKfzZ; f = new Fahrer(pName, ....); }}Auto myCar = new Auto("B-KI 11","Maier");

0300myCar

Objekt myCar

kfzZ

f

0400 B-KI 11

...

0400

0200 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

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

class Auto{ //... public Auto(String pKfzZ, String pName){ kfzZ = pKfzZ; f = new Fahrer(pName, ....); }}Auto myCar = new Auto("B-KI 11","Maier");

0300myCar

Objekt myCar

kfzZ

f

0400 B-KI 11

...

0400

0200 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

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

class Auto{ //... public Auto(String pKfzZ, String pName){ kfzZ = pKfzZ; f = new Fahrer(pName, ....); }}Auto myCar = new Auto("B-KI 11","Maier");

0300myCar

Objekt myCar

kfzZ

f

0400 B-KI 11

...

0400

0200 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

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

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).

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

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(); }}

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

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

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

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); }}

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

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); }}