Java Einführung Teil 2: Objektorientierung Michael Hahsler
Java Einführung Objektorientierte Grundkonzepte
Inhalt Verständnis der grundlegenden Konzepte der Objektorientierung: Objekte Nachrichten Kapselung Klassen und Instanzen Vererbung Polymorphismus Darstellung in UML 2
Objekte Dinge aus der realen Welt (Gegenstände, Personen, Rechte,...) Haben eine Identität und besitzen: Eigenschaften (Attribute) Verhalten (Operationen) Kommunizieren mit anderen Objekten durch Nachrichten 3
Nachrichten und Methoden Nachrichten sind Signale von einem Objekt an ein anderes. Nachrichten lösen Verhalten (Operationen) des anderen Objekts aus. Nachricht trinken (einen Schluck) Michael 1. Dose 4
Kapselung (Encapsualtion, Data Hiding) Objekte können Attribute und Operationen (und damit Komplexität) verbergen. Operationen werden vor dem Zugriff von außen geschützt. Die allgemein zugänglichen Operationen nennt man Interface Wieviel Flüssigkeit ist in dieser Dose? Kann jeder diese Dose verschließen? 5
Klassen (-definition) Bauplan für ähnliche Objekte. Beschreibt Operationen und Attribute die eine Instanz bekommt. Instanzen werden aus Klassen erzeugt Instanzierung Volumen = x Klassendefinition Instanz Nr. 1 Instanz Nr. 2 6
Generalisierung, Vererbung (Inheritance) Hierarchische Beziehung zwischen Klassen mit ähnlichen Eigenschaften. Kinder (Subklassen) erben die Eigenschaften von Eltern (Superklassen). Stellt ein gemeinsames Interface sicher. Behälter Ich kenne das Interface eines Behälters (Superklasse) Dose Häferl Gießkanne Subklassen erben, erweitern oder überschreiben Eigenschaften 7
Polymorphismus (Griechisch: Vielgestaltigkeit) Subklassen können auch als Instanz der Superklasse (Behälter) behandelt werden, da sie durch die Vererbung ein gemeinsames Interface haben. Behälter Dose Häferl Gießkanne Ich verwende einen Behälter Jede Art von Behälter hat das gleiche Interface. Einige Operationen reagiert aber bei unterschiedlichen Behältertypen ein bisschen anders! 8
Modellierung und Abstraktion Eigenschaften und Verhalten müssen modelliert werden. Modellierung ist Vereinfachung! Modellierung ist Einschränkung! Was ist das Wesentliche? Hängt vom Zweck ab! Ist diese Nutzung eines Häferls durch das Modell vorgesehen? 9
Vorteile der Objekt-Orientierung Objekte in Programmen entsprechen realen Objekten (von Analyse bis zur Implementierung) Modularität durch die Kapselung in Objekte Wiederverwendung von Objektbibliotheken (Interfaces) Geringere Kosten bei Wartung weil der Programmcode übersichtlicher wird. 10
Die Unified Modeling Language UML ist eine von der OMG standardisierte Notation zur Darstellung und Entwicklung von objekt-orientierten Systemen Die Notation enthält unter anderem Diagramme für die Beschreibung von: Anforderungen (Use Case Diagram) Verhalten/Ablauf (Sequence D., Communication D.) Logischer Aufbau des Systems (Klassendiagramm) 11
Darstellung von Klassen in UML Diagrammen Klassen sind die Baupläne für Objekte (Instanzen) Darstellung in UML Klassenname Beispiel einer Klasse in UML PKW oder Klassenname Attribute Methoden Farbe Leistung Geschwindigkeit... Beschleunigen() Bremsen() Lenken()... Klasse W59777: PKW Rot 50km Objekte (Instanzen) 12
Elemente Klassendiagramm I Klassen Klassenname Beziehungen (Paths/Associations): für die Übermittlung von Nachrichten (Messages = Aufruf von Methoden) Klasse A spricht mit Klasse B Richtung der Beziehungen (Navigability): Nachrichten können nur in diese Richtung gehen Klasse A spricht mit Klasse B 13
Elemente Klassendiagramm II Kardinalitäten (Multiplicity): Anzahl der möglichen Instanzen Klasse A 1 spricht mit 0..* Klasse B Aggregation (Aggregation/Composition): Besteht-aus Beziehung Auto Generalisierung (Generalization): is-a Beziehung -> Vererbung in Java besteht aus 1 * Einzelteil Einzelteil Auto oder Einzelteil * Motor Karosserie... 14
Elemente Klassendiagramm III Abhängigkeiten (Dependencies) Klasse A benötigt Klasse B Anmerkungen oder Einschränkung PKW ist nur fahrttüchtig mit: Räder, Karosserie,... PKW 15
Beispiel: Klassendiagramm PKW ist nur fahrttüchtig mit: Räder, Karosserie,... PKW 0..* verwendet 1 besteht aus 1 * Motor Einzelteil Karosserieteil... Fahrzeughalter 1 besteht aus 4 Zylinder 16
Was Sie nach dieser Einheit wissen sollten... Was sind Objekte, Instanzen und Klassen? Was sind die wichtigsten Konzepte der Objektorientierung und was bedeuten Sie? Wie werden Klassen in UML Klassendiagrammen dargestellt? 17
Java Einführung Klassendefinitionen
Inhalt dieser Einheit Java-Syntax Klassen definieren Objekte instanziieren Instanzvariable deklarieren Klassenvariable deklarieren, Guth, Kaukal, Klimesch 2
Klassen definieren In der Problemanalyse haben Sie die geeigneten Klassen, ihre Eigenschaften und ihr Verhalten festgelegt. Diese implementieren Sie dann im Quellcode. KlassenName -Variablen +Methoden() class KlassenName { variablendeklarationen; methodendeklarationen;, Guth, Kaukal, Klimesch 3
Neue Klasse definieren (Bsp. Point) Klassendefinition Variablendefinition class Point { double x, x, y; y; Datentyp der Variablen Name der Klasse Namen der Variablen Klasse Point definiert einen Punkte in der Ebene. Point besitzt zwei Variable: x und y. Die Variablen sind vom primitiven Typ double (reelle Zahlen)., Guth, Kaukal, Klimesch 4
Vom Diagramm zum Quellcode (Bsp. Point) Das Klassendiagramm wird in einen kompilierbaren Java-Quellcode umgewandelt: Point -x : double -y : double class Point { double x, x, y; y;, Guth, Kaukal, Klimesch 5
Instanzvariablen (Member Variables) Ein Objekt speichert seine Zustände (Eigenschaften) in Instanzvariablen. Alle Objekte einer Klasse haben die selben (Typ und Anzahl) Instanzvariablen. Eine Variable ist eine Dateneinheit von einem bestimmten Datentyp und hat einen Namen. Datentyp und Name werden in der Klasse deklariert. Der Name ermöglicht den Zugriff auf den Inhalt der Variablen (Abfrage und Änderung). Die Werte der Variablen können während der Laufzeit geändert werden. Instanzvariablen werden am Beginn der Klassendefinition definiert, Guth, Kaukal, Klimesch 6
Instanzvariablen II (Member Variables) Instanzvariablen werden am Beginn der Klassendefinition definiert Instanzvariablen Point -x : double -y : double class Point { double x, x, y; y;, Guth, Kaukal, Klimesch 7
Objekte einer Klasse erzeugen (Bsp. Point) Objekte (Instanzen) einer Klasse werden mit der Methode new erzeugt (=instantiiert): KlassenName objektname = new KlassenName(Initialisierungswerte); z.b. Instanzen der Klasse Point: Point lowerleft = new Point(); Point upperright= new Point(); Point centerpoint = new Point(); Jedes erzeugte Objekt ist eindeutig und hat eigene Kopien der Variablen (x und y). Sie werden daher auch Instanzvariablen genannt., Guth, Kaukal, Klimesch 8
Zugriff auf Instanzvariable (Bsp. Point) ObjektName.VariablenName lowerleft.x = 0.0; lowerleft.y = 0.0; upperright.x = 1280.0; upperright.y = 1024.0; centerpoint.x = 640.0; centerpoint.y = 512.0; x lowerleft (0,0) upperright (1280,1024) centerpoint (640,512) y Jedes Objekt (Instanz) hat ein eigenes x und y., Guth, Kaukal, Klimesch 9
Beispiel class Point {double x, y; class UsePoint { public static void main (String[] arg) { Point lowerleft = new Point(); lowerleft.x = 3.7; lowerleft.y = 5.9; System.out.println(lowerLeft.x +, + lowerleft.y);, Guth, Kaukal, Klimesch 10
Arrays von Instanzen Deklaration ClassName[] name = new ClassName[n]; // n Anzahl Zugriff auf Instanzvariablen einzelner Instanzen in einem Array erfolgt mittels Indizierung auf einzelne Felder und Angabe des Variablennamens. name[index].variablenname = Wert z.b. ein Array, das 52 Point-Instanzen aufnehmen kann Point[] points = new Point[52]; // Array erzeugen points[0] = new Point(); // Eine Instanz erzeugen! points[0].x = 1.0; points[0].y = 10.0;... bzw. int i = 0; System.out.println(points[i].x + ", " + points[i].y);, Guth, Kaukal, Klimesch 11
Lernkontrolle Implementieren Sie eine umfangreiche Klasse Mitarbeiter. Überlegen Sie sich, welche Variablen für diese Klasse sinnvoll sind und definieren Sie ein Array, in welchem 50 Mitarbeiter gespeichert werden können. Ihr Programm soll zu bestimmten Feldern einen Teil der gespeicherten Daten ausgeben., Guth, Kaukal, Klimesch 12
Lernkontrolle Implementieren Sie eine Klasse Lehrveranstaltung. Überlegen Sie sich, welche Variablen für diese Klasse sinnvoll sind. Erzeugen Sie zwei Objekte dieser Klasse, die zwei der Lehrveranstaltungen repräsentieren, die Sie dieses Semester besuchen. Ihr Programm soll die Bezeichnung und die Nummer dieser Lehrveranstaltung ausgeben., Guth, Kaukal, Klimesch 13
Nach dieser Einheit sollten Sie wissen,... wie man in Java Klassen deklariert. wie man innerhalb einer Klasse Variablen deklariert und diesen primitive Datentypen zuweist. wie man in Java aus vordefinierten Klassen Objekte erzeugt. was der Unterschied zwischen Klassen- und Instanzvariablen ist., Guth, Kaukal, Klimesch 14
Java Einführung Einfache Klassen Kapitel 10
Inhalt Deklaration von Klassen Erzeugung und Zerstörung von Instanzen Der Punkt-Operator Instanznamen Instanzen als Argument oder Rückgabewert 2
Deklaration einer Klasse (Klassendefinition) Date day : int month : String year : int class Date { int day; String month; int year; Die Klasse Date hier ist nur als Beispiel gedacht! Wird ein Datum in Java verwendet, sollten die Klassen Date und DateFormat der Java API (in java.util) verwendet werden. 3
Erzeugung und Freigabe von Instanzen Deklaration und Erzeugung von Instanzen Date x, y; x = new Date(); x Instanz y day month year Freigabe von Instanzen Garbage Collection: Sobald kein Zeiger mehr auf das Objekt zeigt (Reference Count) x = null; // x zeigt jetzt auf nichts! 4
Der Punkt-Operator Verwendung der Klassenvariablen (Punkt- Operator) Date x = new Date(); x.day = 13; x.month = "November"; x.year = 2001; x Instanz 13 November 2001 day month year Achtung: month ist vom Typ String und daher kein primitiver Datentyp! 5
Instanznamen Zuweisung von Instanznamen Date x, y; x = new Date(); y = x; y.day = 20; x y Instanz 20 day month year Zuweisung ist nur bei gleichem Datentyp (Klassennamen) erlaubt! 6
Instanzen als Argumente in Date.java: class Date { int day; String month; int year; in UseDate.java: class UseDate { public static void main (String[] args) { Date x = new Date(); x.day=13; x.month="november"; x.year=2003; printdate(x); public static void printdate (Date adate) { System.out.println(aDate.day+". "+adate.month+ " "+adate.year); 7
Objekte als Rückgabewerte in Time.java: class Time { int h, m, s; /*hours,minutes,seconds*/ in UseTime.java: class UseTime { static Time convert (int seconds){ Time t = new Time(); t.h = seconds / 3600; t.m = (seconds % 3600) / 60; t.s = seconds % 60; return t; Objekte können nach der Erzeugung wie Variablen verwendet werden. Durch new unterliegen sie nicht den Regeln des Scopes sondern der Garbage Collection! public static void main (String[] args) { Time thetime = convert(12345); 8
Java Einführung Methoden in Klassen
Lehrziel der Einheit Methoden Signatur (=Deklaration) einer Methode Zugriff/Sichtbarkeit Rückgabewerte Parameter Aufruf von Methoden (Nachrichten) Information Hiding Konstruktoren, Guth, Kaukal, Klimesch 2
Klassendefinition In der Designphase wurden die Eigenschaften (Variablen) und das Verhalten (Methoden) definiert. Im Folgenden wird das Implementieren der Methoden behandelt. KlassenName -Variablen +Methoden() class KlassenName { variablendeklarationen; methodendeklarationen(){, Guth, Kaukal, Klimesch 3
Methoden Objekte interagieren miteinander durch das gegenseitige Aufrufen von Methoden (=Nachrichtenaustausch). Methoden sind Programmteile, die bestimmte Teilaufgaben lösen (und sollten nach diesen selbstsprechend benannt werden). Eine Methode (Nachricht) besteht aus zwei Teilen: der Signatur (bzw. Methodendeklaration), die Angaben über Sichtbarkeit, Rückgabetyp, Name der Methode und Parameter macht. dem Methodenrumpf, in dem die Deklarationen der lokalen Variablen und die eigentlichen Anweisungen stehen., Guth, Kaukal, Klimesch 4
Zweck von Methoden Zustand eines Objektes abfragen point1.getx(); astring.length(); Aufforderung an ein Objekt, etwas zu tun (z.b. Instanzvariable verändern) point1.setinvisible(true); astring.touppercase();, Guth, Kaukal, Klimesch 5
Methodendeklaration Zugriff/Sichtbarkeit Methodenname Bezeichner des Parameters public double setx(double xvalue) Typ des Rückgabewerts Typ des Parameters, Guth, Kaukal, Klimesch 6
Beispiel zu Methode class Point { public double x, y; //Methodendeklaration:... public double distance(point pkt) { double xdiff = x - pkt.x; double ydiff = y - pkt.y; return Math.sqrt(xdiff*xdiff +ydiff*ydiff); //Methodenaufruf: Class PointTester { public static void main(string[] args) { Point lowerleft = new Point(); lowerleft.x = 0.1; Point upperrigth = new Point(); upperright.x = 0.1; double d = lowerleft.distance(upperright); danach enthält Variable d die Euklidische Distanz zwischen lowerleft und upperright., Guth, Kaukal, Klimesch 7
Variablenzugriff Innerhalb der Methode einer Instanz können die eigenen Variablen und Methoden direkt (d.h. ohne Angabe des Instanznamens) aufgerufen werden. z.b. Variable x in der Instanz lowerleft bei Aufruf lowerleft.distance(upperright) Instanz lowerleft x, y Instanz upperright x, y public double distance(point pkt) { double xdiff = x - pkt.x; double ydiff = y - pkt.y; return Math.sqrt(xdiff*xdiff +ydiff*ydiff);, Guth, Kaukal, Klimesch 8
Standardvariable this this ist eine Referenz zum aktuellen Objekt, oder anders ausgedrückt this ist eine Referenz auf die aktuelle Instanz der Klasse in der man sich gerade befindet. Über this kann auf alle Variablen und Methoden der Instanz zugegriffen werden., Guth, Kaukal, Klimesch 9
this 2 class Point { double x,y; void setx(double x) { this.x = x; //Instanzvariable x wird gesetzt Instanzvariablenname Parametername Innerhalb einer Methode überschreiben bei Namenskonflikten (=gleicher Bezeichnung) die Parameternamen die Variablennamen der Klasse. Lösung: Verwendung von this oder anderen Parameterbezeichner wählen, z.b. newname., Guth, Kaukal, Klimesch 10
Statische Elemente Variablen und Methoden, die nicht zu einer bestimmten Instanz sonder zur Klasse gehören. Statische Variablen/Methoden sind auch dann verfügbar, wenn noch keine Instanz der Klasse erzeugt wurde. Statische Variablen/Methoden können über den Klassennamen aufgerufen werden. Deklaration durch das Schlüsselwort: static Bsp: class Point { double x, y; static int count; Point.count kann dann zum Beispiel benutzt werden um die Anzahl der Instanzen von Punkt zu speichern. Auf diese Variable kann von jeder Instanz der Klasse Point aus zugegriffen werden., Guth, Kaukal, Klimesch 11
Statische Elemente Programmaufbau class Programm { public static void main(string[] args) Jede Applikation braucht eine Klasse, wo die Applikation startet. Diese Klasse hat eine main-methode. Das Programm startet mit dieser Klasse bei der main-methode. Der main-methode werden die Eigenschaften public und static zugewiesen. static bedeutet, wie wir wissen, dass keine Instanz der Klasse angelegt werden muss. Und zu Beginn einer Applikation existieren ja auch noch keine Instanzen. public bedeutet hier, dass die Java Virtual Machine die Main- Methode des Programms aufrufen darf, um das Programm zu starten., Guth, Kaukal, Klimesch 12
Konstruktoren Jede Klasse benötigt einen oder mehrere Konstruktoren. Konstruktoren: reservieren den Speicherplatz für eine neu zu erzeugende Instanz, weisen den Instanzvariablen initiale Werte zu, haben denselben Namen wie die Klasse, werden wie Methoden deklariert, aber ohne Rückgabewert KlassenName(Parameter){... Zu einer Klasse können mehrere Konstruktoren mit verschiedenen Parametern deklariert werden., Guth, Kaukal, Klimesch 13
Konstruktoren Beispielklasse Student class Student { private String matrnr; private String name; private int semester; Student(String name, String matrnr) { this.name = name; this.matrnr = matrnr;, Guth, Kaukal, Klimesch 14
Konstruktoren - Anwendung Jedes Objekt der Klasse Student kann nun durch den Konstruktor mit zwei Werten initialisiert werden: Eine Zeichenkette, um den Namen zu initialisieren. Eine Zahl um die Matrikelnummer zu setzen. Student mystudent = new Student("Else Maier", "0524343");, Guth, Kaukal, Klimesch 15
Spezialisierte Konstruktoren Zweiter Konstruktor (in Klassendefinition) mit anderer Anzahl bzw. anderen Typen von Parametern: Student(String name, String matrnr, int semester){ this(name, matrnr); this.semester=semester; Aufruf (aus einem Programm): Student mystudent = new Student("Else Maier", "9324343", 5); Abhängig von der Parameterzahl und ihren Datentypen wird der entsprechende Konstruktor aufgerufen. Innerhalb dieses Konstruktors wird der erste Konstruktor über this(...); aufgerufen., Guth, Kaukal, Klimesch 16
Spezialisierte Konstruktoren class Student { private String name, matrnr; private int semester; Beispielklasse Student Student(String studname, String studmatrnr) { //Konstruktor 1 name = studname; matrnr = studmatrnr; Student(String name, String matrnr, int semester) { // Konstruktor 2 this(name, matrnr); //Aufruf Konstruktor 1 this.semester=semester;, Guth, Kaukal, Klimesch 17
Default-Konstruktor //Konstruktor 1 verwenden Student s1 = new Student("Petra Schmidt", "0051998"); //Konstruktor 2 verwenden Student s2 = new Student("Peter Baum", "9988764", 2); Wenn kein Konstruktor erstellt wurde, wird von Java default-mäßig ein Konstruktor (ohne Parameter) zur Verfügung gestellt. Student s = new Student();, Guth, Kaukal, Klimesch 18
Zugriffskontrolle In JAVA gibt es drei Attribute und eine Standardeinstellung, die den Gültigkeitsbereich von Klassen, Variablen und Methoden regeln, d.h. festlegen, ob bzw. welche anderen Objekte auf eine Klasse, Variable oder Methode der programmierten Klasse zugreifen können: private protected public package (Standardeinstellung), Guth, Kaukal, Klimesch 19
Zugriffskontrolle 2 Grundsätzlich: alle Methoden oder Variablen können innerhalb der Klasse, in der sie geschrieben sind, verwendet oder aufgerufen werden. private Methoden oder Variablen können nur innerhalb der eigenen Klasse verwendet oder aufgerufen werden. keine Angabe (=Standardeinstellung) Methoden oder Variablen sind innerhalb der Eigenen Klasse und innerhalb ihres Pakets* zugreifbar. protected Wie Standardeintellung. Zusätzlich können abgeleite Klassen** (auch außerhalb des Pakets*) diese Methoden und Variablen verwenden. public Methoden oder Variablen lassen sich generell von allen anderen Klassen und Paketen aus aufrufen (Interface von Klassen in Paketen). * Pakete sind Sammlungen von zusammengehörigen Klassen. ** Vererbung wird später behandelt. Einschränkung nimmt zu, Guth, Kaukal, Klimesch 20
Zugriffskontrolle 3 class Student { private String name; //... class Uni { public static void main(string[] args) { Student stud1 = new Student(); stud1.name = Peter ; /* Zugriff außerhalb der Klasse Student auf private-variable nicht möglich, kann nur innerhalb der Klasse Student gesetzt werden */, Guth, Kaukal, Klimesch 21
Information Hiding Verstecken der Implementierung einer Klasse hinter den Methoden, die auf ihre internen Daten ausgeführt werden. Das heißt: kein direkter Zugriff auf die Variablen, sondern nur via Methodenaufruf: stud1.setname("peter Meyer"); String name = stud1.getname(); Dieses wichtige Konzept der oop wird auch Data Encapsulation (Datenkapselung) genannt., Guth, Kaukal, Klimesch 22
Information Hiding - Code 1 Die Deklaration der Variablen als private verhindert den unerwünschten Zugriff auf die Variablen von außerhalb der Klasse. class Student { private String private int... name; matnr;, Guth, Kaukal, Klimesch 23
Information Hiding - Code 2 Auf die Variablen kann nur über die Methoden get und set zugegriffen werden. Diese Methoden müssen public deklariert werden.... public String getname() { return name; public int getmatnr() { return matnr;..., Guth, Kaukal, Klimesch 24
Information Hiding - Code 3... public void setname(string name) { this.name = name; public void setmatnr(string matnr) { this.matnr = matnr; Mit den Methoden set können den entsprechenden Variablen Werte zugewiesen werden., Guth, Kaukal, Klimesch 25
Klasse Student gesamt class Student { private String name; private int matnr; Student(String name, int matnr){ this.name = name; this.matnr = matnr; public String getname(){ return name; public int getmatnr(){ return matnr; /* keine set-methoden: Die Variablen können nur gelesen werden */, Guth, Kaukal, Klimesch 26
Information Hiding - Vorteile Die Implementierung der Daten kann verändert werden, ohne dass Programmcode außerhalb der Klasse geändert werden muss. Der Zugriff auf die verschiedenen Variablen kann eingeschränkt werden. Dies verhindert sowohl Datenmanipulationen als auch irrtümliche Veränderung oder Abfrage der Daten. Außerdem können damit die Programmierfehler eingeschränkt werden., Guth, Kaukal, Klimesch 27
Nach dieser Einheit sollten Sie... die Zugriffskontrolle von Methoden kennen, die Signatur verschiedener Methoden interpretieren können, die Bedeutung der Konstruktoren kennen, Methoden implementieren können, Information Hiding und statische Methoden kennen und anwenden können., Guth, Kaukal, Klimesch 28
Java Einführung Objektorientierung Kapitel 11
Inhalt Methoden in Klassen Aufruf der Methoden Konstruktoren Statische Komponenten 2
Klassen Klassen fügen Attribute und Methoden zu einer logischen Einheit zusammen. Name Attribute Methoden Klassen sind die Grundbausteine der objektorientierten Programmierung. 3
Methoden in Klassen Fraction int n int d void set (int n, int d) void add (Fraction f) void subtract (Fraction f) void multiply (Fraction f) void divide (Fraction f) class Fraction { public int n; // Zaehler public int d; // Nenner public void set (int nn, int dd){ n=nn; d=dd; public void add (Fraction f){ n = n*f.d + f.n*d; d = d*f.d; public void substract(fra..... 4
Aufruf von Methoden in Klassen I Fraction a = new Fraction(); a.set(1,2); Instanz a... void set (int nn, int dd) { n = nn; d = dd;... Instanzvariablen können in den Methoden auch mit this angesprochen werden. Z.B. kann die Methode set so aussehen: void set (int n, int d) { this.n = n; this.d = d; 5
Aufruf von Methoden in Klassen II Fraction a = new Fraction(); a.n=1; a.d=2; Fraction b = new Fraction(); b.n=3; b.d=5; a.add(b); Instanz a... void add (Fraction f) { n = n*f.d + f.n*d; d = d*f.d;... Die Instanz a enthält nun das Ergebnis der Addition. 6
Konstruktoren Wenn ein Instanz erzeugt wird, werden alle Klassenvariablen automatisch erzeugt und erhalten folgende Werte: Zahlen: 0 oder 0.0 Referenzen (Strings, Arraynamen, Instanznamen): null Boolean: false Bei der Erzeugung wir eine spezielle Methode aufgerufen (Konstruktor, gleicher Name wie die Klasse, kann Argumente haben). In dieser Methode können die Werte der Instanzvariablen initialisiert werden. 7
Definition von Konstruktoren class Fraction{ int n,d; Fraction () { // Default-Konstruktor n=0; d=1; Fraction (int n, int d) { this.n = n; // this bezeichnet die Klassenvariablen this.d = d; Fraction (Fraction tocopy) { // Copy-Konstrukor* this.n = tocopy.n; this.d = tocopy.d;... * Java unterstützt die Methode.clone() der Klasse Object 8
Verwendung von Konstruktoren Aufruf: Default Konstruktor Fraction c = new Fraction(); // 0/1 Aufruf: Konstruktor mit Argumenten Fraction d = new Fraction(3,7); // 3/7 9
Statische Komponenten Variablen und Methoden die mit dem Schlüsselwort static deklariert werden: Existieren nur 1x (pro Klasse pro Programm) Existieren auch ohne dass eine Instanz der Klasse erzeugt werden muss Können auch über den Klassennamen angesprochen werden Class.field bzw. Class.method() 10
Bsp: Statische Komponenten II class MyProg { static void print (String s){ Out.println(s); public static void main (String[] arg) { for (int i=0; i<arg.length; i++) { print(arg[i]); Die Methode main wird beim Programmstart mit dem Array aus Strings aufgerufen. Z.B. java MyProg Hallo, wie geht es? 11
Die Klasse Object in Java In Java wird jede Klasse von Object abgeleitet und erbt daher einige Methoden. Object String tostring() Object clone() boolean equals(object obj) Fraction String... siehe java.lang.object in der API Spezifikation 12
tostring() Automatische Konversion zu String class Fraction { int n, d; public String tostring() { return("fraction(" + d + "/" + n + ")") class TestFraction { public static void main(string[] args) { f1 = new Fraction(1,2); System.out.println(f1); 13
Java Einführung HelloNewWorld oder HelloWorld - revised
Das original Programm Methode class HelloWorld { public static void main (String[] args) { Kommentar // Hello world ausgeben System.out.println( Hello world ); Anweisung Block Klasse 2
Das Problem Das Programm ist nicht 'sehr' objekt-orientiert Es verwendet keine Klassen, Methoden und Nachrichten! 3
Das neue Design HelloNewWorld Mouth +main() +shout(message) 4
Implementierung Mouth Die Datei Mouth.java: class Mouth { // Konstruktor Mouth () { System.out.println("Hello, I am a new mouth!"); // Methoden public void shout(string amessage) { System.out.println("The mouth shouts: "+amessage); 5
Implementierung HelloNewWorld Die Datei HelloNewWorld.java: class HelloNewWorld { public static void main (String[] args) { // Neue Instanz von Mouth Mouth OurMouth = new Mouth(); // Methode shout aufrufen OurMouth.shout("Hello New World!"); 6
Kompilierung javac HelloNewWorld.java durch diesen Befehl wird die Datei HelloNewWorld.java übersetzt. Da der Kompiler feststellt, dass auch die Klasse Mouth benötigt wird, wird diese im aktuellen Verzeichnis gesucht und auch übersetzt. Ergebnis: HelloNewWorld.class Mouth.class Ausführung: java HelloNewWorld 7
Java Einführung Objekt-Datentypen und Strings Kapitel 8 und 9
Inhalt Was sind Objekt-Datentypen Sonderheiten bei Zuweisung und Vergleich Zeichenketten (Strings) Zeichencodes Char, Char-Arrays und Strings String-Operationen String-Konversion 2
Objekt-Datentyp Jede Klasse in Java stellt einen sogenannten Objektdaten-Typ (Benuzerdefinierter Datentyp) dar. Die Instanzen verhalten sich meist wie primitive Datentypen, es gibt jedoch wichtige Unterschiede! 3
Bsp: Date class Date { int day; String month; int year; Date int day String month int year Date kann nach der Deklaration wie ein Datentyp verwendet werden. 4
Erzeugung und Freigabe Deklaration und Erzeugung von Instanzen Date x, y; x = new Date(); x Objekt y day month year Freigabe von Objekten Garbage Collection: Sobald kein Zeiger mehr auf das Objekt zeigt (Reference Count) x = null; // x zeigt jetzt auf nichts! 5
Punkt-Operator Verwendung der Klassenvariablen (Punkt- Operator) Date x = new Date(); x.day = 13; x.month = "November"; x.year = 2001; x Objekt 13 November 2001 day month year Achtung: month ist vom Typ String und daher eigentlich ein Array. 6
Zuweisung Zuweisung von Objektnamen Date x, y; x = new Date(); y = x; y.day = 20; x y Objekt 20 day month year Es wird nur die Referenz kopiert, nicht der Wert! Zuweisung ist nur bei gleichem Datentyp (Klassennamen) erlaubt! 7
Vergleich Date x, y; x = new Date(); y = new Date(); y.day = 20; x.day = 20; if (x==y) { System.out.println("x ist gleich y"); x y Instanz 20 Instanz 20 day month year day month year Vergleich ergibt immer falsch, weil die Zeiger verglichen werden! 8
Übergabe als Parameter Date addoneday (Date b){ b.day++; return b;... Date a = new Date(); a.day=19; b a c Instanz 19 20 day month year Date c = addoneday(a); // a hat jetzt auch 20! 9
Zeichenketten in Java (Strings) Zeichenketten bestehen aus einzelnen Zeichen. Diese Zeichen sind vom primitiven Datentyp char Zeichenketten können als Array von char erzeugt werden, oder als eigener Objekt-Datentyp String (ist in den Bibliotheken von Java vorhanden unter java.lang.string) 10
Zeichenkonstanten und -codes 'a', 'A', '?'... Zeichen werden in Java codiert als: ASCII (American Standard Code of Information Interchange): 128 Zeichen, benutzt 7 Bit, keine Umlaute... Darstellung: Zahl (Hex oder Dezimal) Unicode: benutzt 2 Byte, 65536 Zeichen, ersten 128 sind identisch mit ASCII (siehe: www.unicode.org ) Darstellung: \unnnn... nnnn ist der Code in Hex 11
Zeichenvariable (Primitiver Datentyp) Deklaration char ch; Zuweisung ch = 'a'; Kompatibilität mit int char ch2 = 'x'; int i = ch2; // ok, Code in int-variable ch2 = (char) (i+1); 12
Standardfunktionen für Zeichen Auswahl von Java-Bibliothek Standardfunktionen: if (Character.isLetter(ch))... // Unicode? if (Character.isDigit(ch))... // Digit? ch=character.touppercase(ch); // Groß ch=character.tolowercase(ch); // Klein siehe: java.lang.character 13
char-arrays Eine Kette von Zeichen. Deklaration: char[] s1 = new char[20]; char[] s2 = {'a','b','c'; Zugriff auf einzelne Zeichen: s2[1]='x'; // ersetzt 'b' durch 'x' 14
Strings - Zeichenketten (Objekt-Datentyp) Char-Arrays sind relativ umständlich zu verwenden. Da Zeichenketten häufig vorkommen, stellt Java einen eigenen Bibliothekstyp mit dem Namen String (in java.lang) zur Verfügung. 15
String-Konstanten Zeichenfolge zwischen doppelten Hochkommas "Hello, I am a String!" "Alice\t2000\nBob\t1500" "Das \"-Zeichen " "Griechische Symbol (pi): \u03c0" Achtung: Unterschied zwischen 'x' und "x" 16
Datentyp String Deklaration String a, b; Zuweisung a = "Hallo"; b = a; a b Hallo Achtung: Strings verhalten sich wie Arrays. Der Name ist nur ein Zeiger auf das "String-Objekt" 17
Verkettung von Strings Verkettung String a = "Hallo"; a = a + " Welt!"; // einfache Verkettung Andere Datentypen (z.bsp: int) werden zu String konvertiert int i = 12; String b = "Es ist " + i; System.out.println("i hat den Wert " + i); 18
Vergleich von Strings String s = new String("Hallo"); if (s=="hallo") {... // Fehler: Referenzen werden verglichen! if (s.equals("hello")) {... /* die richtige Funktion (siehe: java.lang.string) */ 19
Stringoperationen die Java-Bibliothek definiert eine Reihe nützlicher Funktionen für Strings (siehe: java.lang.string) String s = "a long string"; string s2; int i; char ch; i = s.length(); // bei Arrays kein ()! ch = s.charat(3); i = s.indexof("ng"); s2= s.substring(2,6) if (s.startswith("abc")) {... 20
java.lang.stringbuffer Strings haben nach der Erzeugung eine fixe Länge. Zum zeichenweisen Aufbau eines Strings ist dies ungeeignet. int i; // x kann sein char,int,float... StringBuffer b = new StringBuffer("Hallo"); b.append("rld"); i= b.length(); b.insert(4,"o W"); // an Stelle 4 einfügen b.delete(0,4); // Zeichen von 0-4 löschen b.replace(1,3,"abc"); /* Zeichen 1-3 durch "abc" ersetzen */ 21
Stringkonversionen Oft müssen Strings in andere Datentypen konvertiert werden oder umgekehrt: int i = Integer.parseInt("123"); float f = Float.parseFloat("3.14"); String s = String.valueOf(x); char[] a = s.tochararray(); 22
Nach dieser Einheit sollten Sie wissen,... was der Unterschied zwischen primitiven und Objekt-Datentypen ist wie Objekt-Datentypen erzeugt, verwendet uns als Parameter übergeben werden wie Strings in Java funktionieren 23
Java Einführung Umsetzung von Beziehungen zwischen Klassen Kapitel 7
Inhalt Wiederholung: Klassendiagramm in UML Java-Umsetzung von Generalisierung Komposition Assoziationen 2
Das Klassendiagramm Zweck der Darstellung Logischen Aufbau des Systems Statischen Aspekte Zusammenhänge und Beziehungen zwischen den Komponenten 3
Klassen in UML Klassen sind die Baupläne für Objekte (Instanzen) Darstellung in UML Klassenname Beispiel einer Klasse in UML PKW oder Klassenname Attribute Methoden Farbe Leistung Geschwindigkeit... Beschleunigen() Bremsen() Lenken()... Klasse W59777: PKW Rot 50km Objekte (Instanzen) 4
Elemente Klassendiagramm I Klassen Klassenname Beziehungen (Paths/Associations): für die Übermittlung von Nachrichten (Messages = Aufruf von Methoden) Klasse A spricht mit Klasse B Richtung der Beziehungen (Navigability): Nachrichten können nur in diese Richtung gehen Klasse A spricht mit Klasse B 5
Elemente Klassendiagramm II Kardinalitäten (Multiplicity): Anzahl der möglichen Instanzen Klasse A 1 spricht mit 0..* Klasse B Aggregation (Aggregation/Composition): Besteht-aus Beziehung Auto besteht aus 1 * Einzelteile Generalisierung (Generalization): is-a Beziehung -> Vererbung in Java Einzelteil Motor Karosserie... 6
Elemente Klassendiagramm III Abhängigkeiten (Dependencies) Klasse A benötigt Klasse B Anmerkungen oder Einschränkung PKW ist nur fahrttüchtig mit: Räder, Karosserie,... PKW 7
Beispiel: Klassendiagramm PKW ist nur fahrttüchtig mit: Räder, Karosserie,... PKW 0..* verwendet 1 besteht aus 1 * Motor Einzelteil Karosserieteil... Fahrzeughalter 1 besteht aus 4 Zylinder 8
Umsetzung von Generalisierung Einzelteil Motor Karosserie... Vererbung abstract class Einzelteil { // muss nicht unbedingt abstract sein!... class Motor extends Einzelteil {... 9
Umsetzung von Komposition I PKW class Rad {... besteht aus 1 4 Rad class PKW { Rad livorad, revorad, lihirad, rehirad; //Instanznamen PKW() { /* Erzeugung der Instanzen der Räder */ livorad = new Rad(); revorad = new Rad(); lihirad = new Rad(); rehirad = new Rad(); 10
Umsetzung von Komposition II PKW 1 class Einzelteil {... class PKW { final int ANZAHL=100; // besteht aus 100 Teilen Einzelteil[] dieeinzelteile; /* Implementierung als Array von Instanznamen (auch als Container moeglich) */ besteht aus PKW() { dieeinzelteile = new Einzelteil[ANZAHL]; /* Array erzeugen */ for(int i=0;i<anzahl; i++) { dieeinzelteile[i] = new Einzelteil(); /* Erzeugung der Instanzen der Einzelteile */ * Einzelteil 11
Umsetzung einer Assoziation class PKW {... class Fahrzeughalter { PKW meinpkw; // nur Instanzname PKW... 1 void PKWkaufen(PKW einpkw) { verwendet meinpkw=einpkw; // Referenz auf die Inst. setzen 1 class Michael { Fahrzeughalter public static void main(string[] args) { PKW PKW1 = new PKW(); // PKW erzeugen Fahrzeughalter michael = new Fahrzeughalter(); michael.pwkkaufen(pkw1); // PKW an den Farzeughalter uebergeben 12
Umsetzung von komplexeren Assoziationen Assoziationen mit höherer (>1) Kardinalität Es muss ein Container (z.b. Array, Liste) verwendet werden. Assoziationen mit Navigierbarkeit in beide Richtungen: Jede Seite muss eine Referenz der anderen Seite haben. Achtung: Problem mit Inkonsistenz! 13
Übung Implementieren Sie das gesamte Klassendiagramm. Überlegen Sie sich sinnvolle Attribute und Methoden sowie Einzelteile (mindestens 4). PKW 0..* verwendet 1 besteht aus 1 * Motor Einzelteil Karosserie... Fahrzeughalter 1 besteht aus 4 Zylinder 14
Nach dieser Einheit sollten Sie wissen,... wie Beziehungen in UML-Klassendiagrammen dargestellt werden welche Arten von Beziehungen es gibt wie diese Beziehungen in Java umgesetzt werden können. 15