Java Einführung - Michael Hahsler

Werbung
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
Grundzüge der Programmierung - Hahsler
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
Grundzüge der Programmierung - Hahsler
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
Grundzüge der Programmierung - Hahsler
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?
Grundzüge der Programmierung - Hahsler
5
Klassen (-definition)
• Bauplan für ähnliche Objekte.
• Beschreibt Operationen und Attribute die eine
Instanz bekommt.
• Instanzen werden aus Klassen erzeugt
Instanzierung
Volumen = x
Instanz Nr. 1
Instanz Nr. 2
Klassendefinition
Grundzüge der Programmierung - Hahsler
6
Generalisierung,
Vererbung (Inheritance)
• Hierarchische Beziehung zwischen Klassen mit ähnlichen
Eigenschaften.
• Kinder (Subklassen) erben die Eigenschaften von Eltern
(Superklassen).
• Stellt ein gemeinsames Interface sicher.
Ich kenne das Interface eines
Behälters (Superklasse)
Behälter
Subklassen erben, erweitern
oder überschreiben
Eigenschaften
Dose
Häferl
Gießkanne
Grundzüge der Programmierung - Hahsler
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
Ich verwende einen Behälter
Gießkanne
Jede Art von Behälter hat das
gleiche Interface. Einige
Operationen reagiert aber bei
unterschiedlichen
Behältertypen ein bisschen
anders!
Grundzüge der Programmierung - Hahsler
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?
Grundzüge der Programmierung - Hahsler
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.
Grundzüge der Programmierung - Hahsler
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)
Grundzüge der Programmierung - Hahsler
11
Darstellung von Klassen in
UML Diagrammen
Klassen sind die Baupläne für Objekte (Instanzen)
Darstellung in UML
Klassenname
oder
Klassenname
Beispiel einer Klasse in UML
PKW
Farbe
Leistung
Geschwindigkeit
....
Attribute
Methoden
Beschleunigen()
Bremsen()
Lenken()
...
Klasse
Grundzüge der Programmierung - Hahsler
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
Grundzüge der Programmierung - Hahsler
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
besteht aus
*
1
Einzelteil
oder
Auto
Einzelteil *
Generalisierung (Generalization): is-a Beziehung -> Vererbung in
Java
Einzelteil
Motor
Karosserie
...
Grundzüge der Programmierung - Hahsler
14
Elemente Klassendiagramm III
Abhängigkeiten (Dependencies)
benötigt
Klasse A
Klasse B
Anmerkungen oder Einschränkung
PKW ist nur fahrttüchtig
mit: Räder, Karosserie,...
PKW
Grundzüge der Programmierung - Hahsler
15
Beispiel: Klassendiagramm
PKW ist nur fahrttüchtig
mit: Räder, Karosserie,...
besteht aus
PKW
1
Einzelteil
*
0..*
verwendet
1
Motor
besteht aus
Fahrzeughalter
Karosserieteil
...
1
4
Zylinder
Grundzüge der Programmierung - Hahsler
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?
Grundzüge der Programmierung - Hahsler
17
Java Einführung
Klassendefinitionen
Inhalt dieser Einheit
• Java-Syntax
•
•
•
•
Klassen definieren
Objekte instanziieren
Instanzvariable deklarieren
Klassenvariable deklarieren
Grundzüge der Programmierung - Hahsler, 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.
class
class KlassenName
KlassenName {{
KlassenName
variablenDeklarationen;
variablenDeklarationen;
-Variablen
+Methoden()
methodenDeklarationen;
methodenDeklarationen;
}}
Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch
3
Neue Klasse definieren
(Bsp. Point)
Klassendefinition
class
class Point
Point {{
Name der Klasse
Variablendefinition
double
double x,
x, y;
y;
}}
Namen der Variablen
Datentyp 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).
Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch
4
Vom Diagramm zum Quellcode
(Bsp. Point)
Das Klassendiagramm wird in einen kompilierbaren
Java-Quellcode umgewandelt:
Point
class
class Point
Point {{
-x : double
-y : double
double
double x,
x, y;
y;
}}
Grundzüge der Programmierung - Hahsler, 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
Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch
6
Instanzvariablen II
(Member Variables)
• Instanzvariablen werden am Beginn der Klassendefinition
definiert
Instanzvariablen
Point
-x : double
-y : double
class
class Point
Point {{
double
double x,
x, y;
y;
}}
Grundzüge der Programmierung - Hahsler, 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.
Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch
8
Zugriff auf Instanzvariable
(Bsp. Point)
upperRight
(1280,1024)
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
centerPoint
(640,512)
y
lowerLeft
(0,0)
Jedes Objekt (Instanz) hat ein eigenes x und y.
Grundzüge der Programmierung - Hahsler, 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);
}
}
Grundzüge der Programmierung - Hahsler, 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);
Grundzüge der Programmierung - Hahsler, 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.
Grundzüge der Programmierung - Hahsler, 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.
Grundzüge der Programmierung - Hahsler, 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.
Grundzüge der Programmierung - Hahsler, 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
Grundzüge der Programmierung - Hahsler
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.
Grundzüge der Programmierung - Hahsler
3
Erzeugung und Freigabe von
Instanzen
• Deklaration und Erzeugung von Instanzen
x
Instanz
Date x, y;
x = new Date();
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!
Grundzüge der Programmierung - Hahsler
4
Der Punkt-Operator
• Verwendung der Klassenvariablen (PunktOperator)
Date x = new Date();
x
x.day = 13;
x.month = "November";
x.year = 2001;
Instanz
day
November month
year
2001
13
Achtung: month ist vom Typ String und daher
kein primitiver Datentyp!
Grundzüge der Programmierung - Hahsler
5
Instanznamen
• Zuweisung von Instanznamen
Date x, y;
x = new Date();
x
Instanz
20
y = x;
y.day = 20;
y
day
month
year
Zuweisung ist nur bei gleichem Datentyp
(Klassennamen) erlaubt!
Grundzüge der Programmierung - Hahsler
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);
}
}
Grundzüge der Programmierung - Hahsler
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);
}
}
Grundzüge der Programmierung - Hahsler
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
Grundzüge der Programmierung - Hahsler, 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
class
class KlassenName
KlassenName {{
variablenDeklarationen;
variablenDeklarationen;
methodenDeklarationen(){
methodenDeklarationen(){
-Variablen
+Methoden()
}}
}}
Grundzüge der Programmierung - Hahsler, 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.
Grundzüge der Programmierung - Hahsler, 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();
Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch
5
Methodendeklaration
Methodenname
Zugriff/Sichtbarkeit
Bezeichner des
Parameters
public double setX(double xValue)
Typ des Rückgabewerts
Typ des
Parameters
Grundzüge der Programmierung - Hahsler, 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.
Grundzüge der Programmierung - Hahsler, 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
Instanz upperRight
x, y
x, y
public double distance(Point pkt)
{
double xdiff = x - pkt.x;
double ydiff = y - pkt.y;
return Math.sqrt(xdiff*xdiff
+ydiff*ydiff);
}
Grundzüge der Programmierung - Hahsler, 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.
Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch
9
this 2
class Point {
double x,y;
void setX(double x) {
this.x = x;
Instanzvariablenname
Parametername
//Instanzvariable x wird gesetzt
}} …
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.
Grundzüge der Programmierung - Hahsler, 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.
Grundzüge der Programmierung - Hahsler, 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 MainMethode des Programms aufrufen darf, um das Programm zu starten.
Grundzüge der Programmierung - Hahsler, 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.
Grundzüge der Programmierung - Hahsler, 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;
}
}
Grundzüge der Programmierung - Hahsler, 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");
Grundzüge der Programmierung - Hahsler, 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.
Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch
16
Spezialisierte Konstruktoren
Beispielklasse Student
class Student {
private String name, matrNr;
private int semester;
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;
}
}
Grundzüge der Programmierung - Hahsler, 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();
Grundzüge der Programmierung - Hahsler, 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)
Grundzüge der Programmierung - Hahsler, 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.
•
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).
Einschränkung nimmt zu
• private
* Pakete sind Sammlungen von zusammengehörigen Klassen.
** Vererbung wird später behandelt.
Grundzüge der Programmierung - Hahsler, 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 */
}
}
Grundzüge der Programmierung - Hahsler, 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.
Grundzüge der Programmierung - Hahsler, 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
name;
private int
matNr;
...
}
Grundzüge der Programmierung - Hahsler, 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;
}
...
Grundzüge der Programmierung - Hahsler, 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.
Grundzüge der Programmierung - Hahsler, 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 */
Grundzüge der Programmierung - Hahsler, 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.
Grundzüge der Programmierung - Hahsler, 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.
Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch
28
Java Einführung
Objektorientierung
Kapitel 11
Inhalt
•
•
•
•
Methoden in Klassen
Aufruf der Methoden
Konstruktoren
Statische Komponenten
Grundzüge der Programmierung - Hahsler
2
Klassen
• Klassen fügen
Name
• Attribute und
• Methoden
Attribute
zu einer logischen Einheit zusammen.
Methoden
• Klassen sind die Grundbausteine der
objektorientierten Programmierung.
Grundzüge der Programmierung - Hahsler
3
Methoden in Klassen
Fraction
int n
int d
class Fraction {
public int n; // Zaehler
public int d; // Nenner
public void set (int nn, int dd){
void set (int n, int d)
void add (Fraction f)
void subtract (Fraction f)
void multiply (Fraction f)
void divide (Fraction f)
n=nn; d=dd;
}
public void add (Fraction f){
n = n*f.d + f.n*d;
d = d*f.d;
}
public void substract(Fra..
...
Grundzüge der Programmierung - Hahsler
}
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;
}
Grundzüge der Programmierung - Hahsler
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;
Instanz a
a.add(b);
...
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.
Grundzüge der Programmierung - Hahsler
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.
Grundzüge der Programmierung - Hahsler
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
Grundzüge der Programmierung - Hahsler
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
Grundzüge der Programmierung - Hahsler
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()
Grundzüge der Programmierung - Hahsler
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?
Grundzüge der Programmierung - Hahsler
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
Grundzüge der Programmierung - Hahsler
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);
}
}
Grundzüge der Programmierung - Hahsler
13
Java Einführung
HelloNewWorld
oder
HelloWorld - revised
Das original Programm
Klasse
Block
Methode
class HelloWorld {
public static void main (String[]
args)
{
Kommentar
// Hello world ausgeben
System.out.println(“Hello world“);
}
Anweisung
}
Grundzüge der Programmierung - Hahsler
2
Das Problem
• Das Programm ist nicht 'sehr' objekt-orientiert
• Es verwendet keine Klassen, Methoden und
Nachrichten!
Grundzüge der Programmierung - Hahsler
3
Das neue Design
HelloNewWorld
Mouth
+main()
+shout(message)
Grundzüge der Programmierung - Hahsler
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);
}
}
Grundzüge der Programmierung - Hahsler
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!");
}
}
Grundzüge der Programmierung - Hahsler
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
Grundzüge der Programmierung - Hahsler
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
Grundzüge der Programmierung - Hahsler
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!
Grundzüge der Programmierung - Hahsler
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.
Grundzüge der Programmierung - Hahsler
4
Erzeugung und Freigabe
• Deklaration und Erzeugung von Instanzen
x
Objekt
Date x, y;
x = new Date();
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!
Grundzüge der Programmierung - Hahsler
5
Punkt-Operator
• Verwendung der Klassenvariablen (PunktOperator)
Date x = new Date();
x
x.day = 13;
x.month = "November";
x.year = 2001;
Objekt
day
November month
year
2001
13
Achtung: month ist vom Typ String und daher
eigentlich ein Array.
Grundzüge der Programmierung - Hahsler
6
Zuweisung
• Zuweisung von Objektnamen
Date x, y;
x = new Date();
x
Objekt
20
y = x;
y.day = 20;
y
day
month
year
• Es wird nur die Referenz kopiert, nicht der Wert!
• Zuweisung ist nur bei gleichem Datentyp
(Klassennamen) erlaubt!
Grundzüge der Programmierung - Hahsler
7
Vergleich
x
Instanz
20
Date x,
x = new
y = new
y.day =
y;
Date();
Date();
20; x.day = 20;
y
day
month
year
Instanz
20
day
month
year
if (x==y) {
System.out.println("x ist gleich y");
}
• Vergleich ergibt immer falsch, weil die Zeiger
verglichen werden!
Grundzüge der Programmierung - Hahsler
8
Übergabe als Parameter
Date addOneDay (Date b){
b.day++;
return b;
b
}
a
Instanz
19 20
c
...
Date a = new Date(); a.day=19;
Date c = addOneDay(a); // a hat jetzt
Grundzüge der Programmierung - Hahsler
day
month
year
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)
Grundzüge der Programmierung - Hahsler
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
Grundzüge der Programmierung - Hahsler
11
Zeichenvariable (Primitiver Datentyp)
• Deklaration
char ch;
• Zuweisung
ch = 'a';
• Kompatibilität mit int
char ch2 = 'x';
int i = ch2; // ok, Code
ch2 = (char) (i+1);
in int-Variable
Grundzüge der Programmierung - Hahsler
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
Grundzüge der Programmierung - Hahsler
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'
Grundzüge der Programmierung - Hahsler
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.
Grundzüge der Programmierung - Hahsler
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"
Grundzüge der Programmierung - Hahsler
16
Datentyp String
• Deklaration
String a, b;
• Zuweisung
a = "Hallo";
b = a;
a
Hallo
b
• Achtung: Strings verhalten sich wie Arrays. Der
Name ist nur ein Zeiger auf das "String-Objekt"
Grundzüge der Programmierung - Hahsler
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);
Grundzüge der Programmierung - Hahsler
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) */
Grundzüge der Programmierung - Hahsler
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")) {....
Grundzüge der Programmierung - Hahsler
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");
b.delete(0,4);
// an Stelle 4 einfügen
// Zeichen von 0-4 löschen
b.replace(1,3,"abc");
/* Zeichen 1-3 durch "abc"
ersetzen */
Grundzüge der Programmierung - Hahsler
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();
Grundzüge der Programmierung - Hahsler
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
Grundzüge der Programmierung - Hahsler
23
Java Einführung
Umsetzung von Beziehungen
zwischen Klassen
Kapitel 7
Inhalt
• Wiederholung:
Klassendiagramm in UML
• Java-Umsetzung von
• Generalisierung
• Komposition
• Assoziationen
Grundzüge der Programmierung - Hahsler
2
Das Klassendiagramm
• Zweck der Darstellung
• Logischen Aufbau des Systems
• Statischen Aspekte
• Zusammenhänge und Beziehungen zwischen den
Komponenten
Grundzüge der Programmierung - Hahsler
3
Klassen in UML
Klassen sind die Baupläne für Objekte (Instanzen)
Darstellung in UML
Klassenname
oder
Klassenname
Beispiel einer Klasse in UML
PKW
Farbe
Leistung
Geschwindigkeit
....
Attribute
Methoden
Beschleunigen()
Bremsen()
Lenken()
...
Klasse
Grundzüge der Programmierung - Hahsler
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
Grundzüge der Programmierung - Hahsler
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
besteht aus
Auto
1
*
Einzelteile
• Generalisierung (Generalization): is-a Beziehung -> Vererbung in
Java
Einzelteil
Motor
Karosserie
...
Grundzüge der Programmierung - Hahsler
6
Elemente Klassendiagramm III
• Abhängigkeiten (Dependencies)
benötigt
Klasse A
Klasse B
• Anmerkungen oder Einschränkung
PKW ist nur fahrttüchtig
mit: Räder, Karosserie,...
PKW
Grundzüge der Programmierung - Hahsler
7
Beispiel: Klassendiagramm
PKW ist nur fahrttüchtig
mit: Räder, Karosserie,...
besteht aus
PKW
1
Einzelteil
*
0..*
verwendet
1
Motor
besteht aus
Fahrzeughalter
Karosserieteil
...
1
4
Zylinder
Grundzüge der Programmierung - Hahsler
8
Umsetzung von Generalisierung
Einzelteil
Vererbung
Motor
Karosserie
...
abstract class Einzelteil {
// muss nicht unbedingt abstract sein!
...
}
class Motor extends Einzelteil {
...
}
Grundzüge der Programmierung - Hahsler
9
Umsetzung von Komposition I
PKW
besteht aus
1
Rad
4
class Rad {...}
class PKW {
Rad liVoRad, reVoRad, liHiRad, reHiRad; //Instanznamen
PKW() {
/* Erzeugung der Instanzen der Räder */
liVoRad
reVoRad
liHiRad
reHiRad
=
=
=
=
new
new
new
new
Rad();
Rad();
Rad();
Rad();
}
}
Grundzüge der Programmierung - Hahsler
10
Umsetzung von Komposition II
PKW
besteht aus
1
Einzelteil
*
class Einzelteil {...}
class PKW {
final int ANZAHL=100; // besteht aus 100 Teilen
Einzelteil[] dieEinzelteile; /* Implementierung als Array
von Instanznamen (auch als Container moeglich) */
PKW() {
dieEinzelteile = new Einzelteil[ANZAHL]; /* Array
erzeugen */
for(int i=0;i<ANZAHL; i++) {
dieEinzelteile[i] = new Einzelteil(); /* Erzeugung
der Instanzen der Einzelteile */
}
}
}
Grundzüge der Programmierung - Hahsler
11
Umsetzung einer Assoziation
class PKW {...}
class Fahrzeughalter {
PKW
PKW meinPKW; // nur Instanzname
...
1
void PKWkaufen(PKW einPKW) {
verwendet
1
meinPKW=einPKW; // Referenz auf die Inst. setzen
}
}
Fahrzeughalter
class Michael {
public static void main(String[] args) {
PKW PKW1 = new PKW(); // PKW erzeugen
Fahrzeughalter michael = new Fahrzeughalter();
michael.PWKkaufen(PKW1);
// PKW an den Farzeughalter uebergeben
}
}
Grundzüge der Programmierung - Hahsler
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!
Grundzüge der Programmierung - Hahsler
13
Übung
• Implementieren Sie das gesamte Klassendiagramm.
Überlegen Sie sich sinnvolle Attribute und Methoden
sowie Einzelteile (mindestens 4).
besteht aus
PKW
1
Einzelteil
*
0..*
verwendet
1
Motor
besteht aus
Fahrzeughalter
Karosserie
...
1
4
Zylinder
Grundzüge der Programmierung - Hahsler
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.
Grundzüge der Programmierung - Hahsler
15
Herunterladen