Assoziationen Beziehungen Zwischen Objekten kann es eine Beziehung
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
Leserichtung (optional) Beziehungspfeil; Navigation unidirektional; also nur in eine Richtung: vom Auto zum Fahrer Name der Assoziation (optional) Auto 1 gehört 1 Fahrer Kardinalitäten (zu einem Auto gibt es einen Fahrer und zu einem Fahrer gibt es ein Auto
Wie kann dies in Java umgesetzt werden?
Bemerkung: Zwecks übersichtlicher Darstellung werden nicht benutzte get- und set. Methoden weggelassen.
Mit diesem Attribut kommt man vom Auto zum Fahrer Kfz-Zeichen Autofahrer class Auto{ public String kfz. Z; public Fahrer f; } public void set. Kfz. Zeichen( String p. Kfz. Z){ kfz. Z = p. Kfz. Z; }
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 class Fahrer{ public String name; } public void set. Name( String p. Name){ name = p. Name; }
public class Main. Assoziation_1 zu 1 Uni_nr 1 a{ public static void main(String[] args){ Fahrer my. Fahrer = new Fahrer(); Auto my. Car = new Auto(); my. Car. set. Kfz. Zeichen("B-KI 11"); my. Fahrer. set. Name("Maier"); my. Car. f = my. Fahrer; System. out. println("Name des Autofahrers=" +my. Car. f. name); } } Wie wird ein Fahrer erzeugt? Wie wird ein Auto erzeugt? Wie bekommt das Auto das KFZ-Zeichen "B-KI 11" ? Wie bekommt der Fahrer den Namen "Maier" ? Wie verlinkt man das Auto mit dem Fahrer? Wie gibt man (vom Auto ausgehend) den Namen des Fahrers auf dem Bildschirm aus?
public class Main. Assoziation_1 zu 1 Uni_nr 1 a{ public static void main(String[] args){ Fahrer my. Fahrer = new Fahrer(); Auto my. Car = new Auto(); my. Car. set. Kfz. Zeichen("B-KI 11"); my. Fahrer. set. Name("Maier"); my. Car. f = my. Fahrer; System. out. println("Name des Autofahrers=" +my. Car. f. name); } } Warum befindet sich im Design der Klassen Auto und Fahrer ein Verstoß gegen die OOP? Weil die Attribute name, kfz. Z 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 kfz. Z; private Fahrer f; public void set. Kfz. Zeichen( String p. Kfz. Z){ kfz. Z = p. Kfz. Z; } public void set. Fahrer( Fahrer pf){ f = pf; } public Fahrer get. Fahrer(){ return(f); } // gleich geht es weiter. . .
public Auto(){ } }
class Fahrer{ private String name; public void set. Name( String p. Name){ name = p. Name; } public String get. Name(){ return(name); } public Fahrer(){ } }
public class Main. Assoziation_1 zu 1 Uni_nr 1 b{ public static void main(String[] args){ Fahrer my. Fahrer = new Fahrer(); Auto my. Car = new Auto(); my. Car. set. Kfz. Zeichen("B-KI 11"); my. Fahrer. set. Name("Maier"); my. Car. set. Fahrer(my. Fahrer); System. out. println("Name des Autofahrers=" +my. Car. get. Fahrer(). get. Name()); } } Wie wird ein Fahrer erzeugt? Wie verlinkt man das Auto mit dem Fahrer? Wie wird ein Auto erzeugt? Wie bekommt das Auto das KFZ-Zeichen "B-KI 11" ? Wie bekommt der Fahrer den Namen "Maier" ? Wie gibt man (vom Auto ausgehend) den Namen des Fahrers auf dem Bildschirm aus?
public class Main. Assoziation_1 zu 1 Uni_nr 1 b{ public static void main(String[] args){ Fahrer my. Fahrer = new Fahrer(); Auto my. Car = new Auto(); my. Car. set. Kfz. Zeichen("B-KI 11"); my. Fahrer. set. Name("Maier"); my. Car. set. Fahrer(my. Fahrer); System. out. println("Name des Autofahrers=" +my. Fahrer. get. Name()); } } Wie kann man den Namen des Fahrers noch einfacher ausgeben ? Das geht aber nur, weil man in main mit my. Fahrer einen Link auf ihn hat. Später werden wir einen Fall konstruieren, wo es in main keinen Link auf diesen Fahrer gibt und man deswegen mit my. Fahrer(). get. Name() nicht mehr auf ihn zugreifen kann.
public class Main. Assoziation_1 zu 1 Uni_nr 1 b{ public static void main(String[] args){ Fahrer my. Fahrer = new Fahrer(); Auto my. Car = new Auto(); my. Car. set. Kfz. Zeichen("B-KI 11"); my. Fahrer. set. Name("Maier"); my. Car. set. Fahrer(my. Fahrer); System. out. println("Name des Autofahrers=" +my. Car. get. Fahrer(). get. Name()); } } 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 kfz. Z; private Fahrer f; public Auto(String p. Kfz. Z, Fahrer pf){ kfz. Z = p. Kfz. Z; f = pf; } } public Fahrer get. Fahrer(){ return(f); }
class Fahrer{ private String name; public Fahrer(String p. Name){ name = p. Name; } } public String get. Name(){ return(name); }
public class Main. Assoziation_1 zu 1 Uni_nr 1 { public static void main(String[] args){ Fahrer my. Fahrer = new Fahrer("Maier"); Auto my. Car = new Auto("B-KI 11", my. Fahrer); System. out. println("Name des Autofahrers=" +my. Car. get. Fahrer(). get. Name()); } } Wie wird ein Fahrer mit Namen "Maier" erzeugt? Wie wird ein Auto mit KFZ-Zeichen "B-KI 11" erzeugt und gleichzeitig mit dem obigen Fahrer verlinkt? Wie gibt man (vom Auto ausgehend) den Namen des Fahrers auf dem Bildschirm aus?
public class Main. Assoziation_1 zu 1 Uni_nr 1 { public static void main(String[] args){ Fahrer my. Fahrer = new Fahrer("Maier"); Auto my. Car = new Auto("B-KI 11", my. Fahrer); System. out. println("Name des Autofahrers=" +my. Car. get. Fahrer(). get. Name()); } } 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 kfz. Z; private Fahrer f; public Auto(String p. Kfz. Z, String p. Name){ kfz. Z = p. Kfz. Z; f = new Fahrer(p. Name); } } public Fahrer get. Fahrer(){ return(f); } Im Konstruktor von Auto wird ein Fahrer erzeugt.
class Fahrer{ private String name; public Fahrer(String p. Name){ name = p. Name; } } public String get. Name(){ return(name); } hier ändert sich nichts
public class Main. Assoziation_1 zu 1 Uni_nr 1 { public static void main(String[] args){ Auto my. Car = new Auto("B-KI 11", "Maier"); System. out. println("Name des Autofahrers =" +my. Car. get. Fahrer(). get. Name()); } } Der Fahrer wird nicht in der Methode main(. . . ) erzeugt, sondern im Konstruktor Auto(. . . ). Wie wird ein Auto mit KFZ-Zeichen "B-KI 11" erzeugt, das von "Maier" gefahren wird ? Wie gibt man den Namen des Fahrers auf dem Bildschirm aus?
Komplette Darstellung in UML
Leserichtung (optional) Beziehungspfeil; Navigation unidirektional; also nur in eine Richtung: vom Auto zum Fahrer Name der Assoziation (optional) Auto 1 gehört Rollennamen. Ein Rollenname kann auch weggelassen werden. Dann muss er aber im UML in der Liste der Attribute notiert werden. 1 f Fahrer Kardinalitäten (zu einem Auto gibt es einen Fahrer und zu einem Fahrer gibt es ein Auto
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.
Grund 1: 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.
Grund 2: Laufzeitverhalten! Beispiel: (1: 1 Assoziation) Wenn man wissen will, welches Auto zu einem bestimmten Fahrer F gehören, dann müsste man alle Autos durchgehen und prüfen, ob dazu der Fahrer F gehört. Das kann zu einem schlechten Laufzeitverhalten führen, Deswegen benutzt man die Bidirektionalität.
Diese Bidirektionalität hat aber auch Kosten: Das ist der Aufwand, um die Daten konsistent (widerspruchsfrei) zu halten. Bei Änderungen (z. B. wechselt ein Fahrer sein Auto) müssen 2 Objekte geändert werden, um sicherzustellen dass die Daten konsistent sind. Unidirektionale Assoziationen sind dagegen viel einfacher zu warten.
Bidirektionale Darstellung in UML
Navigation birektional; also in zwei Richtungen: vom Auto zum Fahrer und vom Fahrer zum Auto 1 Manchmal wird in UML bidirektional durch einen Pfeil mit 2 Pfeilspitzen dargestellt. 1 Fahrer Alles ist gleich wie vorher, außer der Bidirektionalität
Wie kann dies in Java umgesetzt werden?
Mit diesem Attribut kommt man vom Auto zum Fahrer class Auto{ public String kfz. Z; public Fahrer f; } public void set. Kfz. Zeichen( String p. Kfz. Z){ kfz. Z = p. Kfz. Z; }
Mit diesem Attribut kommt man vom Fahrer zum Auto class Fahrer{ public String name; public Auto a; } public void set. Name( String p. Name){ name = p. Name; }
public class Main. Assoziation_1 zu 1 Bi_nr 1 a{ public static void main(String[] args){ Fahrer my. Fahrer = new Fahrer(); Auto my. Car = new Auto(); my. Fahrer. set. Name("Maier"); my. Car. set. Kfz. Zeichen("B-KI 11"); my. Car. f = my. Fahrer; my. Fahrer. a = my. Car; Wie wird ein Fahrer erzeugt? } wird ein Auto erzeugt? Wie } Wie bekommt der Fahrer den Namen "Maier" ? Wie bekommt das Auto das KFZ-Zeichen "B-KI 11" ? Wie verlinkt man das Auto mit dem Fahrer? Wie verlinkt man den Fahrer mit dem Auto ?
public class Main. Assoziation_1 zu 1 Bi_nr 1 a{ public static void main(String[] args){ Fahrer my. Fahrer = new Fahrer(); Auto my. Car = new Auto(); my. Fahrer. set. Name("Maier"); my. Car. set. Kfz. Zeichen("B-KI 11"); my. Car. f = my. Fahrer; my. Fahrer. a = my. Car; System. out. println("Name des Autofahrers=" +my. Car. f. name); System. out. println("K-Zeichen des Fahrers=" +my. Fahrer. a. kfz. Z); } } gibt man (vom Auto ausgehend) den Namen des Fahrers auf Wie dem Bildschirm aus? Wie gibt man (vom Fahrer ausgehend) das Kfz-Zeichen des Autos auf dem Bildschirm aus?
Was gebenclass die folgenden Anweisungen auf dem Bildschirm aus? public Main. Assoziation_1 zu 1 Bi_nr 1 a { public static void main(String[] args){ Fahrer my. Fahrer = new Fahrer(); Auto my. Car = new Auto(); my. Fahrer. set. Name("Maier"); my. Car. set. Kfz. Zeichen("B-KI 11"); my. Car. f = my. Fahrer; my. Fahrer. a = my. Car; System. out. println(my. Car. f. a. name); System. out. println(my. Car. f. a. kfz. Z); System. out. println(my. Car. f. a. f. name); System. out. println(my. Car. f. a. kfz. Z); System. out. println(my. Car. kfz. Z); System. out. println(my. Fahrer. a. f. name); System. out. println(my. Fahrer. name); Kfz-Zeichen des Autos: "B-KI 11" Name des Autofahrers: "Maier" Kfz-Zeichen des Autos: "B-KI 11" } } Kfz-Zeichen des Autos: "B-KI 11" syntaktisch falsch: Auto hat kein Attribut name Name des Autofahrers: "Maier"
public class Main. Assoziation_1 zu 1 Bi_nr 1 a { public static void main(String[] args){ Fahrer my. Fahrer = new Fahrer(); Auto my. Car = new Auto(); my. Fahrer. set. Name("Maier"); my. Car. set. Kfz. Zeichen("B-KI 11"); my. Car. f = my. Fahrer; my. Fahrer. a = my. Car; System. out. println(my. Car. f. a. name); System. out. println(my. Car. f. a. kfz. Z); System. out. println(my. Car. f. a. f. name); System. out. println(my. Car. f. a. kfz. Z); System. out. println(my. Car. kfz. Z); System. out. println(my. Fahrer. a. f. name); Warum befindet sich im Design der Klassen Auto und Fahrer ein Verstoß gegen die OOP? } } Weil die Attribute name, kfz. Z, 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 kfz. Z; private Fahrer f; public Auto(){ } public void set. Kfz. Zeichen(String p. Kfz. Z){ kfz. Z = p. Kfz. Z; } public String get. Kfz. Zeichen(){ return(kfz. Z); } } public void set. Fahrer(Fahrer pf){ f = pf; Mit diesem Attribut kommt } man vom Auto zum Fahrer public Fahrer get. Fahrer(){ return(f); }
class Fahrer{ private String name; private Auto a; public Fahrer(){ } public void set. Name(String p. Name){ name = p. Name; } public String get. Name(){ return(name); } public void set. Auto(Auto pa){ a = pa; } } public Auto get. Auto(){ return(a); } Mit diesem Attribut kommt man vom Fahrer zum Auto
public class Main. Assoziation_1 zu 1 Bi_nr 1 a{ public static void main(String[] args){ Fahrer my. Fahrer = new Fahrer(); Auto my. Car = new Auto(); my. Fahrer. set. Name("Maier"); my. Car. set. Kfz. Zeichen("B-KI 11"); my. Car. set. Fahrer(my. Fahrer); my. Fahrer. set. Auto(my. Car); Wie wird ein Fahrer erzeugt? } wird ein Auto erzeugt? Wie } Wie bekommt der Fahrer den Namen "Maier" ? Wie bekommt das Auto das KFZ-Zeichen "B-KI 11" ? Wie verlinkt man das Auto mit dem Fahrer? Wie verlinkt man den Fahrer mit dem Auto ?
public class Main. Assoziation_1 zu 1 Bi_nr 1 a{ public static void main(String[] args){ Fahrer my. Fahrer = new Fahrer(); Auto my. Car = new Auto(); my. Fahrer. set. Name("Maier"); my. Car. set. Kfz. Zeichen("B-KI 11"); my. Car. set. Fahrer(my. Fahrer); my. Fahrer. set. Auto(my. Car); System. out. println("Name des Autofahrers=" +my. Car. get. Fahrer(). get. Name()); System. out. println("K-Zeichen des Fahrers=" +my. Fahrer. get. Auto(). get. Kfz. Zeichen()); } } gibt man (vom Auto ausgehend) den Namen des Fahrers auf Wie dem Bildschirm aus? Wie gibt man (vom Fahrer ausgehend) das Kfz-Zeichen des Autos auf dem Bildschirm aus?
public class Main. Assoziation_1 zu 1 Bi_nr 1 a{ public static void main(String[] args){ Fahrer my. Fahrer = new Fahrer(); Auto my. Car = new Auto(); my. Fahrer. set. Name("Maier"); my. Car. set. Kfz. Zeichen("B-KI 11"); my. Car. set. Fahrer(my. Fahrer); my. Fahrer. set. Auto(my. Car); System. out. println("Name des Autofahrers=" +my. Car. get. Fahrer(). get. Name()); System. out. println("K-Zeichen des Fahrers=" +my. Fahrer. get. Auto(). get. Kfz. Zeichen()); } } 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{ Mit diesem Attribut kommt private String kfz. Z; man vom Auto zum Fahrer private Fahrer f; public Auto(String p. Kfz. Z, Fahrer pf){ kfz. Z = p. Kfz. Z; f = pf; } public String get. Kfz. Zeichen(){ return(kfz. Z); } } public Fahrer get. Fahrer(){ return(f); }
class Fahrer{ private String name; private Auto a; Mit diesem Attribut kommt man vom Fahrer zum Auto. public Fahrer(String p. Name){ name = p. Name; } public String get. Name(){ return(name); } public void set. Auto(Auto pa){ a = pa; } } public Auto get. Auto(){ return(a); }
public class Main. Assoziation_1 zu 1 Bi_nr 1 a{ public static void main(String[] args){ Fahrer my. Fahrer = new Fahrer("Maier"); Auto my. Car = new Auto("B-KI 11", my. Fahrer); my. Fahrer. set. Auto(my. Car); System. out. println("Name des Autofahrers=" +my. Car. get. Fahrer(). get. Name()); } } 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 Main. Assoziation_1 zu 1 Bi_nr 1 a{ public static void main(String[] args){ Fahrer my. Fahrer = new Fahrer("Maier"); Auto my. Car = new Auto("B-KI 11", my. Fahrer); my. Fahrer. set. Auto(my. Car); System. out. println("Name des Autofahrers=" +my. Car. get. Fahrer(). get. Name()); } System. out. println("K-Zeichen des Fahrers" my. Fahrer. get. Auto(). get. Kfz. Zeichen()); } 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 kfz. Z; private Fahrer f; Mit diesem Attribut kommt man vom Auto zum Fahrer public Auto(String p. Kfz. Z){ kfz. Z = p. Kfz. Z; } public String get. Kfz. Zeichen(){ return(kfz. Z); } public Fahrer get. Fahrer(){ return(f); } } public void set. Fahrer(Fahrer pf){ f = pf; }
class Fahrer{ private String name; private Auto a; public Fahrer(String p. Name, Auto pa){ name = p. Name; Mit diesem Attribut kommt a = pa; man vom Fahrer zum Auto. } public String get. Name(){ return(name); } } public Auto get. Auto(){ return(a); }
public class Main. Assoziation_1 zu 1 Bi_ver 4 { public static void main(String[] args){ Auto my. Car = new Auto("B-KI 11"); Fahrer my. Fahrer = new Fahrer("Maier", my. Car); my. Car. set. Fahrer(my. Fahrer); System. out. println("Name des Autofahrers=" +my. Car. get. Fahrer(). get. Name()); } } 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 Main. Assoziation_1 zu 1 Bi_ver 4 { public static void main(String[] args){ Auto my. Car = new Auto("B-KI 11"); Fahrer my. Fahrer = new Fahrer("Maier", my. Car); my. Car. set. Fahrer(my. Fahrer); System. out. println("Name des Autofahrers=" +my. Car. get. Fahrer(). get. Name()); System. out. println("KF-Zeichen des Fahrers" +my. Fahrer. get. Auto(). get. Kfz. Zeichen()); } } 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 p. Kfz. Z, Fahrer pf){ kfz. Z = p. Kfz. Z; f = pf; } Warum kann man den Konstruktor von } //. . . Fahrer nicht analog dem Konstruktor von Auto implementieren und dann. . . class Fahrer{ //. . . public Fahrer(String p. Name, Auto pa){ name = p. Name; a = pa } //. . . }
. . . in main(. . . ) das Auto und den Fahrer wie folgt anlegen? public class Main. Assoziation_1 zu 1 Bi_nr 1 b{ public static void main(String[] args){ Fahrer my. Fahrer = new Fahrer("Maier", my. Car); Auto my. Car = new Auto("B-KI 11", my. Fahrer); //. . . } } Weil an dieser Stelle das Objekt my. Car noch gar nicht existiert.
Gibt es nicht doch eine Lösung mit jeweils einem Konstruktor mit 2 Parametern?
class Auto{ private String kfz. Z; private Fahrer f; public Auto(String p. Kfz. Z, Fahrer pf){ kfz. Z = p. Kfz. Z; f = pf; } public String get. Kfz. Zeichen(){ return(kfz. Z); } public Fahrer get. Fahrer(){ return(f); } public void set. Fahrer(Fahrer pf){ f = pf; } } Wie gehabt: Der Konstruktor von Auto hat 2 Parameter.
class Fahrer{ private String name; private Auto a; public Fahrer(String p. Name, Auto pa){ name = p. Name; a = pa; } public String get. Name(){ return(name); } } public Auto get. Auto(){ return(a); Auch der Konstruktor von } Fahrer hat 2 Parameter.
public class Main. Assoziation_1 zu 1 Bi_ver 4 { public static void main(String[] args){ Fahrer my. Fahrer = null; Auto my. Car = new Auto("B-KI 11", my. Fahrer); my. Fahrer = new Fahrer("Maier", my. Car); my. Car. set. Fahrer(my. Fahrer); 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 Main. Assoziation_1 zu 1 Bi_ver 4 { public static void main(String[] args){ Fahrer my. Fahrer = null; Auto my. Car = new Auto("B-KI 11", my. Fahrer); my. Fahrer = new Fahrer("Maier", my. Car); my. Car. set. Fahrer(my. Fahrer); System. out. println("Name des Autofahrers=" +my. Car. get. Fahrer(). get. Name()); System. out. println("KF-Zeichen des Fahrers" +my. Fahrer. get. Auto(). get. Kfz. Zeichen()); } } 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. . .
Nebenbei: Folgende Variante einer Lösung wäre auch noch möglich gewesen:
public class Main. Assoziation_1 zu 1 Bi_ver 4 { public static void main(String[] args){ Fahrer my. Fahrer; Auto my. Car = new Auto("B-KI 11", null); my. Fahrer = new Fahrer("Maier", my. Car); my. Car. set. Fahrer(my. Fahrer); System. out. println("Name des Autofahrers=" +my. Car. get. Fahrer(). get. Name()); System. out. println("KF-Zeichen des Fahrers" +my. Fahrer. get. Auto(). get. Kfz. Zeichen()); } } statt: Fahrer my. Fahrer = null; statt: Auto my. Car = new Auto("B-KI 11", my. Fahrer); der folgende Rest ist wie vorher auch. . .
Bemerkung: Im Folgenden werden Daten im Arbeitsspeicher wie folgt dargestellt:
Symbolische Beschreibung durch eine Variable Adresse im Arbeitsspeicher Adresse Wert my. Hund 0100 123 Wert (Inhalt) dieser Adresse (z. B. Gewicht eines Hundes) 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.
Fahrer my. Fahrer = null; my. Fahrer 0100 null Was bewirkt diese Anweisung im Arbeitsspeicher?
Fahrer my. Fahrer = null; Auto my. Car = new Auto("B-KI 11", my. Fahrer); Wie wird my. Car mit dem Objekt verlinkt? my. Fahrer 0100 null my. Car 0300 0400 Warum bekommt f welchen Wert zugewiesen? Im Konstruktor Auto(. . . ) wird der Wert von my. Fahrer (also null) in das Attribut f kopiert. Objekt my. Car kfz. Z f Was bewirkt diese Anweisung im Arbeitsspeicher? 0400 B-KI 11. . . null
Fahrer my. Fahrer = null; Auto my. Car = new Auto("B-KI 11", my. Fahrer); my. Fahrer = new Fahrer("Maier", my. Car); Wie wird my. Fahrer mit dem Objekt verlinkt? my. Fahrer 0100 null my. Car 0300 Objekt my. Car Objekt my. Fahrer 0200. . . Maier kfz. Z f Was bewirkt diese Anweisung im Arbeitsspeicher? 0400 B-KI 11. . . null
Fahrer my. Fahrer = null; Auto my. Car = new Auto("B-KI 11", my. Fahrer); my. Fahrer = new Fahrer("Maier", my. Car); Wie wird my. Fahrer mit dem Objekt verlinkt? my. Fahrer 0100 0200 my. Car 0300 Objekt my. Car Objekt my. Fahrer 0200. . . Maier kfz. Z f 0400 B-KI 11. . . null
Fahrer my. Fahrer = null; Auto my. Car = new Auto("B-KI 11", my. Fahrer); my. Fahrer = new Fahrer("Maier", my. Car); my. Fahrer 0100 0200 Im Konstruktor Fahrer(. . . ) wird der Wert von my. Car (also 0400) in das Attribut a kopiert. a 0200 Maier. . . 0400 Warum bekommt a welchen Wert zugewiesen? Objekt my. Car Objekt my. Fahrer name my. Car 0300 kfz. Z f 0400 B-KI 11. . . null
Fahrer my. Fahrer = null; Auto my. Car = new Auto("B-KI 11", my. Fahrer); my. Fahrer = new Fahrer("Maier", my. Car); my. Fahrer 0100 0200 Objekt my. Car Objekt my. Fahrer name a my. Car 0300 0200 Maier. . . 0400 kfz. Z f 0400 B-KI 11. . . null Auf welches Objekt zeigt also das Attribut a des erstellten Objekts my. Fahrer?
Fahrer my. Fahrer = null; Auto my. Car = new Auto("B-KI 11", my. Fahrer); my. Fahrer = new Fahrer("Maier", my. Car); my. Car. set. Fahrer(my. Fahrer); my. Fahrer 0100 0200 my. Car 0300 0400 Warum bekommt f welchen Wert zugewiesen? In der Methode set. Fahrer(. . . ) wird der Wert von my. Fahrer (also 0200) in das Attribut f kopiert. Objekt my. Car Objekt my. Fahrer name a 0200 Maier. . . 0400 kfz. Z f Was bewirkt diese Anweisung im Arbeitsspeicher? 0400 B-KI 11. . . null
Fahrer my. Fahrer = null; Auto my. Car = new Auto("B KI 11", my. Fahrer); my. Fahrer = new Fahrer("Maier", my. Car); my. Car. set. Fahrer(my. Fahrer); my. Fahrer 0100 0200 Objekt my. Car Objekt my. Fahrer name a my. Car 0300 0200 Maier. . . 0400 Auf welches Objekt zeigt also das Attribut f des erstellten Objekts my. Car? kfz. Z f 0400 B-KI 11. . . 0200
public class Main. Assoziation_1 zu 1 Bi_ver 5 { public static void main(String[] args){ Fahrer my. Fahrer = null; Auto my. Car = new Auto("ES LE 40", my. Fahrer); my. Fahrer = new Fahrer("Maier", my. Car); my. Car. set. Fahrer(my. Fahrer); System. out. println("Name des Autofahrers=" +my. Car. get. Fahrer(). get. Name()); System. out. println("KF-Zeichen des Fahrers" +my. Fahrer. get. Auto(). get. Kfz. Zeichen()); } } 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 Auto in main(. . . ) und den Fahrer im Konstruktor von Auto erzeugt.
class Fahrer{ private String name; private Auto a; p. Name wird in name kopiert public Fahrer(String p. Name, Auto pa){ name = p. Name; a = pa; } } pa wird in a kopiert
class Auto{ private String kfz. Z; private Fahrer f; } public Auto(String p. Kfz. Z, String p. Name){ kfz. Z = p. Kfz. Z; f = new Fahrer(p. Name, . . ); } Was geschieht in main(. . . ) bei folgender Anweisung? Auto my. Car = new Auto("B-KI 11", "Maier");
Aus Platzgründen Teile des Quellcodes weggelassen class Auto{ //. . . public Auto(String p. Kfz. Z, String p. Name){ kfz. Z = p. Kfz. Z; f = new Fahrer(p. Name, . . ); } Welcher Wert muss hier eingetragen werden? } Auto my. Car = new Auto("B-KI 11", "Maier"); my. Car 0300 0400 Was veranlasst diese Anweisung? Anlegen des folgenden Objekts. . . Objekt my. Car kfz. Z f 0400. . . B-KI 11
class Auto{ //. . . public Auto(String p. Kfz. Z, String p. Name){ kfz. Z = p. Kfz. Z; f = new Fahrer(p. Name, . . ); } } Auto my. Car = new Auto("B-KI 11", "Maier"); my. Car 0300 0400 Wie wird dieses gerade angelegte Objekt mit f verlinkt? name a 0200. . . Maier Objekt my. Car kfz. Z f 0400. . . B-KI 11
class Auto{ //. . . public Auto(String p. Kfz. Z, String p. Name){ kfz. Z = p. Kfz. Z; f = new Fahrer(p. Name, . . ); } } Auto my. Car = new Auto("B-KI 11", "Maier"); my. Car 0300 0400 Wie wird dieses gerade angelegte Objekt mit f verlinkt? name a 0200. . . Maier Objekt my. Car kfz. Z f 0400 B-KI 11. . . 0200
class Auto{ //. . . public Auto(String p. Kfz. Z, String p. Name){ kfz. Z = p. Kfz. Z; f = new Fahrer(p. Name, . . ); } } Auto my. Car = new Auto("B-KI 11", "Maier"); my. Car 0300 Jetzt wurden zwar im Konstruktor der Klasse Auto ein Fahrer angelegt, aber. . . name a 0200. . . Maier 0400 Es fehlt die Verlinkung vom Fahrer zum Auto Wie wird dies erreicht? Objekt my. Car kfz. Z f 0400 B-KI 11. . . 0200
Der Zugriff innerhalb einer Methode eines Objekts auf das Objekt class Auto{ //. . . selbst geschieht mit dem Bezeichner this. Auto(String p. Kfz. Z, String Inpublic dem Fall hier wird mit this das Objekt my. Car an denp. Name){ Parameter kfz. Z = p. Kfz. Z; des. Konstrutors von my. Fahrer übergeben. my. Car f = new Fahrer(p. Name, . . ); } } Auto my. Car = new Auto("B-KI 11", "Maier"); my. Car 0300 Welche Information benötigt der Konstruktor noch, damit er auf das Auto zeigen kann? 0400 Warum funktioniert das nicht? Das Auto selbst, also konkret my. Car. Objekt my. Car B-KIdas 11 Weilname im Bauplan nicht Maier schon der Name des Objekts stehen kann, 0200 kfz. Z 0400 irgendein Programmierer später (nach der Erstellung des Bauplans) a. . . f. . . dem Objekt beim Anlegen mit new. . vergibt! 0200
class Auto{ //. . . public Auto(String p. Kfz. Z, String p. Name){ kfz. Z = p. Kfz. Z; this f = new Fahrer(p. Name, . . ); } } Auto my. Car = new Auto("B-KI 11", "Maier"); my. Car 0300 Was bewirkt dies hier konkret im Arbeitsspeicher? name a 0200 Maier. . . 0400 Im Konstruktor von Fahrer(. . . ) wird der Wert von my. Car (also 0400) in das Attribut a kopiert. Objekt my. Car kfz. Z f 0400 B-KI 11. . . 0200
Auf welches Objekt zeigt class Auto{ Auf welches Objekt zeigt also//. . . das Attribut f des das Attribut a des erstellten public Auto(String p. Kfz. Z, String p. Name){ erstellten Objekts my. Car? Fahrers? kfz. Z = p. Kfz. Z; this f = new Fahrer(p. Name, . . ); } } Auto my. Car = new Auto("B-KI 11", "Maier"); my. Car 0300 name a 0200 Maier. . . 0400 Objekt my. Car kfz. Z f 0400 B-KI 11. . . 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 temptest 1; public class Main. Temp. Test 1 { public static void main(String[] args) { Auto my. Auto = new Auto("B-KI 1"); Fahrer my. Fahrer = new Fahrer("Maier"); my. Auto. verlinke(my. Fahrer); // alternativ // my. Fahrer. verlinke(my. Auto); my. Auto. print. Attributs(); my. Fahrer. print. Attributs(); my. Auto. get. Fahrer(). print. Attributs(); my. Fahrer. get. Auto(). print. Attributs(); } }
Aufgabe: Schreiben Sie die Klassen Auto und Fahrer mit den entsprechenden get und set-Methoden und der Methode verlinke(. . . )
class Auto{ private String kfz. Z; private Fahrer f; public Auto(String p. Kfz. Z){ kfz. Z=p. Kfz. Z; } Fahrer get. Fahrer(){ return f; } public void set. Fahrer(Fahrer p. Fahrer){ f = p. Fahrer; } public void verlinke(Fahrer p. F){ set. Fahrer(p. F); f. set. Auto(this); } } void print. Attributs(){ System. out. println("kfz. Z="+kfz. Z); }
class Fahrer{ private String name; private Auto a; public Fahrer(String p. Name){ name=p. Name; } Auto get. Auto(){ return a; } public void set. Auto(Auto p. A){ a = p. A; } public void verlinke(Auto p. A){ set. Auto(p. A); a. set. Fahrer(this); } } void print. Attributs(){ System. out. println("name="+name); }
- Slides: 102