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