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) 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; 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(); 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) 12. Mai 2011 Folie 5 von 28
Referenzen Primitive Typen vs. Referenztypen Initialisierung int value = 42; Speicherabbild 42 Clock clock = new Clock(); Overhead Instanzvariablen 0x00000023 0 0 0 Referenz 0x00000023 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(); 12. Mai 2011 Folie 7 von 28
Objektvariablen Elementzugriff auf Objektvariable über Syntax: Zielobjekt.Objektvariable Beispiel: Clock clock = new Clock(); clock.hour = 10; Zielobjekt Objektvariable int t = clock.hour; Nur Zugriffssyntax zeigt Unterschied zwischen Objektvariablen und lokalen Variablen 12. Mai 2011 Folie 8 von 28
Vergleich von Referenztypen Vergleich von Objekten mit == prüft die Identität: True: wenn beide Operanden ein und das selbe Objekt sind False: wenn die Operanden verschiedene Objekte sind 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 12. Mai 2011 Folie 9 von 28
Lebensdauer Objektvariablen Lebensdauer Lokale Variablen geschaffen wenn die Definition erreicht wird zerstört wenn der Block der Definition verlassen wird Lebensdauer Objektvariablen geschaffen sobald ein Objekt erzeugt wird zerstört wenn das Objekt nicht mehr erreichbar ist 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 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. 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); 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. 12. Mai 2011 Folie 14 von 28
Initialisieren von Datenelementen Defaultwerte Datentyp Zahlen 0 Zeichen (Charakter) Boolean Referenztypen Initialwert \u0000 (ASCII NUL) False null Explizite Initialisierung Definition von Datenelementen mit Standartwerten Innerhalb von Konstruktor Werte setzen Initialisierung in Konstruktor überschreibt die bestehenden Werte 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) { 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; 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; 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. 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. 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 ++; 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;. 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 12. Mai 2011 Folie 23 von 28
Statische Methoden Statische Hilfsmethoden werden auch als Utility- Methoden 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). 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; 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. 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; 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 12. Mai 2011 Folie 28 von 28