Klassen und Objekte

Werbung
Klassen und Objekte
Einführung in Java
Folie 1 von 28
12. Mai 2011
Ivo Kronenberg
Inhalt
•
Objekte
–
–
–
–
Klassendefinitionen
Datenelemente (Klassenattribute)
Instanzieren von Objekten
Konstruktoren
•
Vergleich primitive und Referenztypen
•
Methoden
– Definition
– Überladen von Methoden
– Statische Methoden
•
Statische Datenelemente und Konstanten
•
Enumerationen (Enum Typ)
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 2 von 28
Klassendefinition
•
Bauplan für komplexe Datentypen
•
Zusammengesetzt aus anderen Datentypen
•
Jede Klasse wird in einer Datei definiert, die gleich
heisst wie die Klasse + Endung .java.
Beispiel Klasse: Clock -> Datei: Clock.java
Datei Clock.java:
class Clock {
int hour = 0;
int minute = 0;
int second = 0;
}
Sprachkonstrukte | Ivo Kronenberg
Typname
Instanzvariablen
12. Mai 2011
Folie 3 von 28
Instanzen von Objekten
•
Erzeugen von Objekten geschieht über den new
Operator.
•
Jedes Objekt enthält seine eigene Kopie der Attribute.
•
Zur Instanzierung (Allokierung) wird ein Konstruktor
eines Objektes benötig.
Clock clock = new Clock();
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 4 von 28
Datentypen
•
Primitive Typen
– Zahlen (byte, short, int, long, float, double)
– Boolean (boolean)
– Zeichen (char)
– Atomare Einheit
– Wertsemantik (Variable enthält konkreter Wert)
•
Referenztypen
– Objekte
– Arrays
– Referenzsemantik (Variable enthält Referenz auf Objekt)
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 5 von 28
Referenzen
Primitive Typen vs. Referenztypen
Speicherabbild
Initialisierung
42
int value = 42;
Clock clock = new Clock();
0x00000023
Referenz
…
Overhead
…
0x00000023
0
Instanzvariablen
0
0
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 6 von 28
Null Referenzen
Initialisierung
Clock clock = null;
Speicherabbild
0x00000000
Vergleich auf Null-Referenz:
if(clock == nul) {
clock = new Clock();
}
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 7 von 28
Objektvariablen
•
Elementzugriff auf Objektvariable über Syntax:
•
Beispiel:
Clock clock = new Clock();
clock.hour = 10;
Zielobjekt.Objektvariable
Zielobjekt
Objektvariable
int t = clock.hour;
•
Nur Zugriffssyntax zeigt Unterschied zwischen
Objektvariablen und lokalen Variablen
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 8 von 28
Vergleich von Referenztypen
•
Vergleich von Objekten mit == prüft die Identität:
•
Vergleich mit == ignoriert den Inhalt der Objekte
•
Identität aus Sicht der Programmlogik meist wenig
interessant.
•
Beispiel:
Clock a = new Clock();
Clock b = new Clock();
if(a == b) … // false
– True: wenn beide Operanden ein und das selbe Objekt sind
– False: wenn die Operanden verschiedene Objekte sind
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 9 von 28
Lebensdauer Objektvariablen
•
Lebensdauer Lokale Variablen
•
Lebensdauer Objektvariablen
– geschaffen wenn die Definition erreicht wird
– zerstört wenn der Block der Definition verlassen wird
– geschaffen sobald ein Objekt erzeugt wird
– zerstört wenn das Objekt nicht mehr erreichbar ist
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 10 von 28
Methoden
•
Legen Funktionalität von Objekt fest.
•
Signatur von Methoden bestehend aus:
–
–
–
–
Methodenname
Parameter
Rückgabetyp
…
Rückgabetyp
Methodenname
Parameter
class Clock {
…
void setTime(int hour, int min, int sec) {
…
}
Parameterliste
}
Typ
Sprachkonstrukte | Ivo Kronenberg
Variablenname
12. Mai 2011
Folie 11 von 28
Überladen von Methoden
•
Mehrere gleichnamige Methoden innerhalb einer
Klasse.
•
Parameterlisten sind unterschiedlich (Methoden
haben unterschiedliche Signaturen)
•
Beim Aufruf der Methode erfolgt die Auswahl von der
passenden Methode aufgrund der Parameter.
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 12 von 28
Überladen von Methoden –
Methodenaufruf nicht eindeutig
•
Aufruf muss eindeutig auf eine Methode zuweissbar
sein. Mögliche Schwierigkeiten:
– Implizite Typenkonversion bei mehreren Signaturen mit
kompatiblen Typen.
– Null-Referenzen bei Signaturen mit Referenztypen als
Parameter.
// Überladene Methoden:
void set(int d, double e) { … }
void set(double d, int e) { … }
// Methodenaufruf:
o.set(1, 1);
Sprachkonstrukte | Ivo Kronenberg
Implizite
Typkonvertierung
int -> double
12. Mai 2011
Folie 13 von 28
Konstruktoren
•
Konstruktor dient zur Erzeugung eines neuen Objektes und
dessen Initailisierung.
•
Konstruktor hat gleichen Namen wie Klasse.
•
Konstruktor hat keinen Rückgabetyp.
•
Konstruktor kann Parameterlisten haben.
•
Konstruktor ohne Parameter heisst Default-Konstruktor.
•
Wird kein Konstruktor definiert, erstellt der Kompiler den
Default-Konstruktor.
•
Konstruktoren können überladen werden.
•
Konstruktor wird mit dem new Operator aufgerufen, gefolgt
vom Klassennamen bzw. Konsturktorname.
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 14 von 28
Initialisieren von Datenelementen
•
Defaultwerte
Datentyp
Zahlen
Zeichen (Charakter)
Boolean
Referenztypen
•
Initialwert
0
\u0000 (ASCII NUL)
False
null
Explizite Initialisierung
– Definition von Datenelementen mit Standartwerten
– Innerhalb von Konstruktor Werte setzen
•
Initialisierung in Konstruktor überschreibt die
bestehenden Werte
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 15 von 28
Konstruktor-Verkettung
•
Aufruf von Konstruktor muss erstes Statement sein.
•
Kette von Konstruktor-Aufrufen kann beliebig lange
sein.
Class Clock {
…
Clock() {
this(12, 0, 0);
}
}
Konstruktor-Verkettung
Clock(int hour, int min, int sec) {
…
}
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 16 von 28
This Referenz
•
This ist implizite Variable mit Referenz auf
Objektinstanz.
•
Wird verwendet um Namenskollision aufzulösen
Class Clock {
int hour;
…
}
Clock(int hour, int min, int sec) {
this.hour = hour;
…
}
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 17 von 28
Ergebnis-Rückgabe (Rückgabewert)
•
Rückgabe von Ergebnissen aus Methodenaufruf
mittels return Anweisung.
•
Jeder mögliche Pfad muss ein return aufweisen.
•
Methoden mit Rückgabetyp void liefern kein Erbenis.
Rückgabetyp
int countTicks() {
…
return ticks;
}
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 18 von 28
Unveränderliche Objekte
•
Datenelemente mit final deklarieren.
•
Datenelement muss entweder bei Deklaration
initialisiert werden oder im Konstruktor.
•
Java Datentypen String, Number (Double, Integer, …)
sind unveränderlich.
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 19 von 28
Datenkapselung
•
Datenelemente vor unerlaubtem Zugriff schützen mit
Modifier private.
•
Nur lesender Zugriff wird über getter Methode
gewährleistet.
•
Setter Methode kann Wertzuweisung validieren.
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 20 von 28
Statische Datenelemente
•
Wird geteilt unter allen Objektinstanzen einer Klasse.
•
Unabhängig von Objektinstanz.
Class Clock {
static int counter = 0;
}
Clock() {
Clock.counter ++;
}
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 21 von 28
Konstanten
•
Existieren nicht in Java …
•
Unveränderbare nicht instanzabhängige Variablen.
•
Kombination von static und final Modifiern entspricht
Konstante.
Class Clock {
public static final int HOUERS_PER_DAY = 24;
….
}
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 22 von 28
Statische Methoden
•
Methode ohne Zugriff auf Instanzattribute
(Datenelemente)
•
Visibiltätsmodifier sind erlaubt.
•
Aufruf gleich wie bei statischen Datenelementen:
Clock.getClockCounter();
•
Main-Methode (Hauptprogramm) ist statisch.
•
Einschränkungen in statischen Methoden:
– This Referenz nicht anwendbar
– Instanzattribute (Datenelemente) nicht zugreifbar
– Instanzmethoden (nicht statisch) nicht zugreifbar
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 23 von 28
Statische Methoden
•
Statische Hilfsmethoden werden auch als UtilityMethoden bezeichnet.
•
Sie haben keinen Bezug zu einer Instanz.
•
Klassen, die nur aus statischen Methoden bestehen,
werden als Hilfsklassen bzw. Utility-Klassen
bezeichnet.
•
Für Hilfsklassen soll das erzeugen von Instanzen
unterbunden werden (Privater Konstruktor).
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 24 von 28
Enum
•
Spezielle Art von Klassen.
•
Vergleichbar mit einem fixen Set von Konstanten.
•
Anwendung wie statische Datenelemente.
•
Nicht verwechseln mit java.util.Enumeration!
// Defintion
enum Month {
January, February, March, … December;
}
// Anwendung
Month m = Month.March;
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 25 von 28
Enum – Vordefinierte Methoden
•
Statische Methode valueOf(String s): Versucht aus
einem String einen Enum zu machen.
•
Statische Methode values(): Gibt alle definierten
Werte für eine bestimmte Enumeration zurück.
•
Methode ordinal(): Gibt den Ordinal (Zahlenwert für
einen Enum zurück.
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 26 von 28
Enum - Erweitern
•
Enumerationen können mit Methoden erweitert
werden.
•
Enumerationen können mit Datenelementen erweitert
werden.
•
Konstruktoren für Enumeration zur Datenübergabe
möglich.
enum Month {
January(31), February(28), … December(31);
private int days;
Month(int days) {
Konstruktor
this.days = days;
}
}
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 27 von 28
Enum
Aufgabe Tutorial lesen:
http://download.oracle.com/docs/cd/E17409_01/jav
ase/tutorial/java/javaOO/enum.html
Sprachkonstrukte | Ivo Kronenberg
12. Mai 2011
Folie 28 von 28
Herunterladen