Liste Programmieren – Java Überblick 1 2 3 4 5 6 7 8 9 10 11 Was ist Java? Klassen und Objekte Vererbung Schnittstellen Innere Klassen Exceptions Funktionsbibliothek Datenstrukturen und Algorithmen Ein-/Ausgabe Threads GUI-Programmierung mit SWING © Prof. Dr. Björn Dreher Liste Programmieren - Java 33 Liste Programmieren – Java Überblick: 2. Klassen und Objekte 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Einleitung Kapselung Ein Stack von chars Klassen Statische Methoden und Attribute Objekte erzeugen und zerstören Objektreferenzen © Prof. Dr. Björn Dreher Liste Programmieren - Java 34 1 2. Klassen und Objekte 2.1 Einleitung Motivation Softwaresysteme sind in den letzten 15-20 Jahren immer komplexer geworden Dies erfordert ein immer höheres Abstraktionsvermögen, um die Komplexität zu meistern Hinzu kommt der Bedarf nach wiederverwendbarem Code Weiterhin nimmt neben der eigentlichen Problemlösung die Benutzeroberfläche einen immer höheren Stellenwert ein Beides wird durch eine objektorientierte Vorgehensweise erleichtert © Prof. Dr. Björn Dreher Liste Programmieren - Java 35 2. Klassen und Objekte 2.1 Einleitung Objektorientiert heißt, dass Objektorientierte Programmiersprachen verallgemeinern das Typkonzept herkömmlicher Programmiersprachen: Software als eine Kollektion von Objekten organisiert wird, die beides, Zustand (Datenstruktur) und Verhalten (Funktionen) in sich vereinen Neben den (eventuell wieder strukturierten) Attributen (mit Werten) können auch Methoden (Funktionen) Bestandteil der Datenstruktur sein. Klassen sind Mengen von Objekten mit der gleichen Struktur: gleiche zugreifbare Komponenten (Attribute) und gleiches Verhalten (ausführbaren Methoden). © Prof. Dr. Björn Dreher Liste Programmieren - Java 36 2 2. Klassen und Objekte 2.1 Einleitung Drei Schlüsselbegriffe Vererbung: Kapselung, Vererbung und Polymorphismus. Klassen können in einer Spezialisierungs-Hierarchie angeordnet werden Speziellere Klassen erben von allgemeineren deren Struktur und Methoden Kfz spezialisiert sich zu Pkw und Lkw. Superklasse Bäume, Unterklassen Laubbäume, Nadelbäume. Polymorphismus Instanzen von verschiedenen Klassen aus einer gemeinsamen Vererbungshierarchie zeigen bei gleichnamigen Methodenaufrufen unterschiedliches Verhalten © Prof. Dr. Björn Dreher Liste Programmieren - Java 37 Liste Programmieren – Java Überblick: 2. Klassen und Objekte 2.1 2.2 2.4 2.5 2.6 2.7 Einleitung Kapselung: Ein Stack von chars Klassen Statische Methoden und Attribute Objekte erzeugen und zerstören Objektreferenzen © Prof. Dr. Björn Dreher Liste Programmieren - Java 38 3 2 Klassen und Objekte 2.3 Ein Stack von chars Stack als Klasse public class CharStack { // Konstante private final static int EMPTY = -1; Klassenkonstante // Attribute private int top; private int maxLen; private char [] s; // Methoden public CharStack(int len) { s = new char[len]; maxLen = len; top = EMPTY; } © Prof. Dr. Björn Dreher Liste Programmieren - Java Konstruktor 39 2 Klassen und Objekte 2.3 Ein Stack von chars Stack als Klasse (fortgesetzt) public void push(char c) { top++; s[top] = c; } public char pop() { return s[top--]; } Attribute gehören zur selben Einheit wie Methoden public char topOf() { return s[top]; } public boolean isEmpty() { return (top == EMPTY); } public boolean isFull() { return (top == maxLen-1); } }; © Prof. Dr. Björn Dreher Methoden können Attribute nutzen, ohne sie irgendwie qualifizieren zu müssen Liste Programmieren - Java Methoden bearbeiten „ihre“ Attribute Klasse ist Gültigkeitsbereich der Bezeichner 40 4 2 Klassen und Objekte 2.3 Ein Stack von chars Beispiel für Nutzung CharStack data, operands; Referenzen auf Objekte des ... Typs CharStack data = new CharStack(100); operands = new CharStack(50); ... Explizite Erzeugung des data.push('1'); Objektes, operand.push('+'); Wertzuweisung auf Referenz, data.push('5'); Aufruf des Konstruktors ... while (!data.isEmpty()) { System.out.println(″Gepopped: ″ + data.pop()); ... Aufruf von Methoden Kurze Schreibweise CharStack data = new CharStack(100); CharStack operands = new CharStack(50); ... © Prof. Dr. Björn Dreher 41 Liste Programmieren - Java 2 Klassen und Objekte 2.3 Ein Stack von chars Überladen einer Methode Unterscheidung durch Signatur Methodenname, Anzahl Parameter, Typen der Parameter Rückgabetyp geht dabei nicht ein Beispiel (wenn auch nicht sehr sinnvoll) Zusätzliche Funktion pop mit einem int Parameter, der die Anzahl von Elementen, die gepoppt werden sollen, angibt (Ergebnis ist nur das letzte Element) public char pop() { return s[top--]; } public char pop(int n) { while (n-- > 1) top--; return s[top--]; } © Prof. Dr. Björn Dreher Liste Programmieren - Java n >= 1 angenommen 42 5 2 Klassen und Objekte 2.3 Ein Stack von chars Aufrufe data.pop(); data.pop(5); // Standard pop Operation // Mehrfache pop Operation Wie bei jeder Objekt-Variablen werden durch CharStack s, t, u; zunächst nur drei Referenzen auf Stacks definiert Die eigentlichen Objektinstanzen müssen noch erzeugt werden: s = new CharStack(10); t = new CharStack(100); u = new CharStack(1000); © Prof. Dr. Björn Dreher Liste Programmieren - Java 43 2 Klassen und Objekte 2.3 Ein Stack von chars Für jede Instanz gilt: Jede hat ihren privaten Datenbereich Die Methoden können auf ihre Daten angewandt werden Sie sind fester Bestandteil der Klasse Zugriffsrechte private protected package (kein Schlüsselwort!) public Genauer später! © Prof. Dr. Björn Dreher Liste Programmieren - Java 44 6 Liste Programmieren – Java Überblick: 2. Klassen und Objekte 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Einleitung Kapselung Ein Stack von chars Klassen Statische Methoden und Attribute Objekte erzeugen und zerstören Objektreferenzen © Prof. Dr. Björn Dreher Liste Programmieren - Java 45 2 Klassen und Objekte 2.4 Klassen Eigene Klasse Socke: class Socke { public String farbe; public int gewicht; private boolean istTrocken; public void trockne() { istTrocken = true; } // Öffentlich sichtbar // Öffentlich sichtbar // Außen nicht sichtbar // Methoden sind meist // öffentlich public void wasche() { istTrocken = false; } public boolean istTrocken() { return istTrocken; } } © Prof. Dr. Björn Dreher Liste Programmieren - Java 46 7 2 Klassen und Objekte 2.4 Klassen Eigene Klasse SockenDemo: Nicht initialisierte Referenz class SockenDemo { public static void main(String args[]) { Socke meineSocke; meineSocke = new Socke(); Erzeuge neues Objekt meineSocke.farbe = "rot"; Rufe Konstruktor auf meineSocke.gewicht = 565; Weise Referenz zu meineSocke.wasche(); System.out.println("Ist die Socke trocken? " + meineSocke.istTrocken()); } } © Prof. Dr. Björn Dreher Liste Programmieren - Java 47 2 Klassen und Objekte 2.4 Klassen Parameterübergabe Objekte immer als Referenzen: class Waschmaschine { static void auswaschen(Socke s) { s.farbe = "weiß"; } } public class ZuOftGewaschen { public static void main(String args[]) { Socke omisSocke = new Socke(); omisSocke.farbe = "schwarz"; System.out.println(omisSocke.farbe); Übergabe Objektreferenz Waschmaschine.auswaschen(omisSocke); System.out.println(omisSocke.farbe); } } © Prof. Dr. Björn Dreher Liste Programmieren - Java 48 8 2 Klassen und Objekte 2.4 Klassen Die this-Referenz Wird (unsichtbar) an jeden Konstruktor und jede Methode übergeben Zeigt auf aktuelles Objekt Anwendungen Nutzung überdeckter Objektvariablen (Attribute) Hintereinanderschalten mehrerer Methodenaufrufe für dasselbe Objekt © Prof. Dr. Björn Dreher Liste Programmieren - Java 49 2 Klassen und Objekte 2.4 Klassen Die this-Referenz Nutzung überdeckter Objektvariablen (Attribute) class Punkt { int x, y; void setzePosition(int x, int y) { this.x = x; this.y = y; } © Prof. Dr. Björn Dreher Liste Programmieren - Java 50 9 2 Klassen und Objekte 2.4 Klassen Die this-Referenz Hintereinanderschalten mehrerer Methodenaufrufe für dasselbe Objekt public class GoOn { private int value; public int getValue() { return value } public GoOn inc() { value++; return this; } Liefert Referenz auf sich selbst zurück public static void main(String args[]) { System.out.println(new GoOn().inc().getValue()); // 1 GoOn ref = new GoOn(); ref.inc().inc().inc(); System.out.println( ref.getValue() ); ... © Prof. Dr. Björn Dreher // 3 51 Liste Programmieren - Java 2 Klassen und Objekte 2.4 Klassen Graphische Darstellung einer Klasse „Unified Modeling Language“ (UML) Name der Klasse Socke +farbe: String +gewicht: int -istTrocken: boolean +trockne(): void +wasche(): void +istTrocken: boolean © Prof. Dr. Björn Dreher Liste Programmieren - Java Attribute + : public - : private Methoden 52 10 2 Klassen und Objekte 2.4 Klassen Assoziation zwischen Klassen Austausch von „Nachrichten“ zwischen Objekten Objekte müssen sich „kennen“ Es besteht eine Assoziation zwischen ihnen Wichtigstes Mittel zur Bildung von Objektverbänden Socke +farbe: String +gewicht: int - istTrocken: boolean +produzent: Hersteller produzent Hersteller Socke kennt Ihren Hersteller Hier: Gerichtete Assoziation Einfache Realisierung mit Hilfe einer Referenz „produzent“ © Prof. Dr. Björn Dreher Liste Programmieren - Java 53 2 Klassen und Objekte 2.4 Klassen Klassen Socke und Hersteller: class Socke { public String farbe; public int gewicht; private boolean istTrocken; public Hersteller produzent; ... } class Hersteller { // ... } © Prof. Dr. Björn Dreher Liste Programmieren - Java 54 11 2 Klassen und Objekte 2.4 Klassen Sichtbarkeiten Innerhalb einer Klasse sind alle Attribute und Methoden sichtbar Sichtbarkeit außerhalb der Klasse private von außen nicht zugreifbar public von überall außen zugreifbar keine Angabe protected (in Verbindung mit Vererbung) von allen Klassen desselben Packages zugreifbar Von allen Nachfahrenklassen und von allen Klassen desselben Packages zugreifbar © Prof. Dr. Björn Dreher Liste Programmieren - Java 55 2 Klassen und Objekte 2.4 Klassen Sichtbarkeiten: Beispiel class Password { private String pass = ""; void setPassword(String oldpass, String newpass) { if (oldpass != null && oldpass.equals(pass)) { pass = newpass; System.out.println("Passwort gesetzt!"); } else System.out.println("Passwort konnte nicht gesetzt " + "werden!"); } } © Prof. Dr. Björn Dreher Liste Programmieren - Java 56 12 2 Klassen und Objekte 2.4 Klassen Sichtbarkeiten: Beispiel: Hauptprogramm public class PassDemo { public static void main(String args[]) { Password pwd = new Password(); pwd.setPassword("", "Geheim"); pwd.setPassword("Geheim", "NeuGeheim"); System.out.println(pwd.pass); // Fehler !!! } } Attribut pass ist private! © Prof. Dr. Björn Dreher Liste Programmieren - Java 57 2 Klassen und Objekte 2.4 Klassen Sichtbarkeiten: Regeln Attribute sind meistens private Zugriff über public Methoden Lokale Methoden können private sein Gruppen von Klassen können über Default-Sichtbarkeiten (package) miteinander kommunizieren Bei Vererbung werden Methoden und Attribute, die von der Nachfahrenklasse (und von Klassen im selben Package) verwendet werden sollen, aber nicht von anderen Klassen, als protected gekennzeichnet © Prof. Dr. Björn Dreher Liste Programmieren - Java 58 13 2 Klassen und Objekte 2.4 Klassen Zugriffsmethoden für Attribute Direkter Zugriff kann von Nachteil sein Einhaltung von Wertebereichen Abhängigkeiten zwischen mehreren Attributen Geheimnisprinzip für interne Realisierung set-Zugriffsmethode kann dies sicherstellen Kontostand und Soll/Haben-Attribut Datentyp kann durch Zugriffsmethode abgeschottet werden Übliche Vorgehensweise: Attribute sind private Es gibt öffentliche Zugriffsmethoden: get- und set-Methoden © Prof. Dr. Björn Dreher Liste Programmieren - Java 59 2 Klassen und Objekte 2.4 Klassen Zugriffsmethoden für Attribute class Person { private int age; public int getAge() { return age; } public void setAge(int age) { if (age >= 0) this.age = age; } } © Prof. Dr. Björn Dreher Liste Programmieren - Java 60 14 Liste Programmieren – Java Überblick: 2. Klassen und Objekte 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Einleitung Kapselung Ein Stack von chars Klassen Statische Methoden und Attribute Objekte erzeugen und zerstören Objektreferenzen © Prof. Dr. Björn Dreher Liste Programmieren - Java 61 2 Klassen und Objekte 2.5 Statische Methoden und Attribute Normale Attribute und Methoden Immer mit genau einer Objektinstanz verbunden Attribute kennzeichnen den Zustand dieses Objektes Methoden ändern oder lesen den Zustand dieses Objektes Klassenattribute Nicht mit bestimmter Objektinstanz verbunden Gehört zur Klasse alleine Existiert nur einmal pro Klasse Gleich für alle Objektinstanzen Integer.MAX_INTEGER Math.PI Math.E Zähler der existierenden Instanzen © Prof. Dr. Björn Dreher Liste Programmieren - Java 62 15 2 Klassen und Objekte 2.5 Statische Methoden und Attribute Klassenmethoden Nicht mit bestimmter Objektinstanz verbunden Gehört zur Klasse alleine Unabhängig von Objektattributen Kann sie nicht benutzen Beispiele Math.sin(double x) Math.max(int a, int b) main-Funktion einer Klasse © Prof. Dr. Björn Dreher Erzeugt oft erst eine Instanz der Klasse Liste Programmieren - Java 63 2 Klassen und Objekte 2.5 Statische Methoden und Attribute Realisierung von Klasseneigenschaften Schlüsselwort static Daher auch: Statische Eigenschaften class LittleHelpers { static double PI2 = Math.PI * Math.PI; static double half(double x, double y) { return (x+y)/2.0; } } public class StaticUser { public static void main(String args[]) { System.out.println( LittleHelpers.half(LittleHelpers.PI2, Math.E) ); } } © Prof. Dr. Björn Dreher Liste Programmieren - Java 64 16 2 Klassen und Objekte 2.5 Statische Methoden und Attribute Statische Eigenschaften als Objekteigenschaften nutzen Jedes Objekt hat auch Zugriff zu den Klasseneigenschaften LittleHelpers lh = new LittleHelpers(); System.out.println( lh.PI2 ); System.out.println( LittleHelpers.PI2 ); Empfehlung: Zugriff über Klassenbezeichner Klassenmethoden rufen üblicherweise wieder Klassenmethoden auf Für Objektmethoden muss ein Objekt vorhanden sein Klassenmethoden gibt es immer, wenn es die Klasse gibt Objektmethoden sind nur aufrufbar, wenn es eine Objektinstanz gibt Aus Objektmethoden können ohne weiteres Klassenmethoden aufgerufen werden © Prof. Dr. Björn Dreher 65 Liste Programmieren - Java 2 Klassen und Objekte 2.5 Statische Methoden und Attribute Statische Methoden können nur auf Klassenattribute zugreifen Es existiert für sie keine implizite Objektinstanz Auch die this-Referenz steht nicht zur Verfügung class Falsch { int a; static void klassenMethode() { a = 1; this.a = 2; Falsch: Kein Klassenattribut } } Falsch: this-Referenz existiert nicht © Prof. Dr. Björn Dreher Liste Programmieren - Java 66 17 2 Klassen und Objekte 2.5 Statische Methoden und Attribute Klassenattribute existieren nur einmal pro Klasse Alle Objektinstanzen teilen sich diese Attribute Alle Objekte können sie lesen und verändern Könnte zum Austausch von Informationen zwischen Objekten benutzt werden Analog zu globalen Variablen bei herkömmlicher Programmierung Problematiken: Keine Kapselung Fehlerverursacher schwer zu finden Probleme bei nebenläufigen Zugriffen © Prof. Dr. Björn Dreher Liste Programmieren - Java 67 2 Klassen und Objekte 2.5 Statische Methoden und Attribute Groß-/Kleinschreibung hilft beim Unterscheiden zwischen Klassenund Objekt-Eigenschaften Klassennamen beginnen mit Großbuchstaben Attribut- und Methodennamen beginnen mit Kleinbuchstaben Math.max(a, b) Math eine Klasse max(a, b) ist Klassenmethode Socke s = new Socke(); s.wasche(); s ist Objektreferenz wasche() ist Objektmethode System.out.println("Hello world!"); out ist Klassenattribut der Klasse System, referenziert ein Objekt println(" ") ist Objektmethode dieses Objektes © Prof. Dr. Björn Dreher Liste Programmieren - Java 68 18 2 Klassen und Objekte 2.5 Statische Methoden und Attribute Konstanten Statische Variablen mit dem Zusatz final class SockenTyp { static final int PUNKTIERT = 1, GEFLECKT = 2, GESTREIFT = 3; } Spätere Schreibzugriffe sind nicht möglich Namen von Konstanten werden üblicherweise großgeschrieben Unterstrich zur Trennung von Wortteilen: PI_QUADRAT © Prof. Dr. Björn Dreher Liste Programmieren - Java 69 Liste Programmieren – Java Überblick: 2. Klassen und Objekte 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Einleitung Kapselung Ein Stack von chars Klassen Statische Methoden und Attribute Objekte erzeugen und zerstören Objektreferenzen © Prof. Dr. Björn Dreher Liste Programmieren - Java 70 19 2 Klassen und Objekte 2.6 Objekte erzeugen und zerstören Erzeugung Mit dem new-Operator Speicherbereich: Heap (Haufen), System-Speicherbereich für dynamische Datenstrukturen Vernichtung In Java automatisch durch den Garbage-Collector Wenn das Objekt nicht mehr referenziert wird Garbage-Collector läuft im Hintergrund in bestimmten Zeitabständen © Prof. Dr. Björn Dreher Liste Programmieren - Java 71 2 Klassen und Objekte 2.6 Objekte erzeugen und zerstören Erzeugung im Detail new-Operator legt Speicherbereich für Objekt aufgrund der Klassendefinition an Bestimmte Methode (Konstruktor) wird zur Initialisierung des Objektes aufgerufen Hat den Namen der Klasse (großgeschrieben, wie die Klasse) Hat keinen Ergebnistyp Wird oft mit verschiedenen Parameterversorgungen (Signaturen) überladen Initialisierung des Objektes zu einem konsistenten Zustand Wenn kein anderer Konstruktor definiert ist, wird automatisch der Default-Konstruktor erzeugt Ohne Parameter Macht nichts Kann auch explizit definiert werden Referenz auf Objekt als Ergebnis © Prof. Dr. Björn Dreher Liste Programmieren - Java 72 20 2 Klassen und Objekte 2.6 Objekte erzeugen und zerstören Konstruktor-Beispiel class Socke { Socke() { farbe = "schwarz"; groesse = 40; } Default-Konstruktor Socke( String farbe ) { this.farbe = farbe; groesse = 40; } Socke( String farbe, int groesse ) { this.farbe = farbe; this.groesse = groesse; Aufruf: } Socke s1 = new Socke(); Socke s2 = new Socke("weiss"); private String farbe; Socke s3 = new Socke("grau", 8); private int groesse; } © Prof. Dr. Björn Dreher 73 Liste Programmieren - Java 2 Klassen und Objekte 2.6 Objekte erzeugen und zerstören Anderen Konstruktor der gleichen Klasse aufrufen Wiederverwendung von Code class Socke { Geht bei C++ nicht! Socke( String farbe ) { this.farbe = farbe; // this ist hier die Referenz auf // das eigene Objekt groesse = 40; } Socke() { this( "schwarz" ); // this() leitet hier an anderen // Konstruktor weiter } private String farbe; private int groesse; } © Prof. Dr. Björn Dreher Liste Programmieren - Java 74 21 2 Klassen und Objekte 2.6 Objekte erzeugen und zerstören Anderen Konstruktor der gleichen Klasse aufrufen Wiederverwendung von Code: Beispiel der Java Klasse Point public class Point extends Point2D implements java.io.Serializable { public int x, y; public Point() { this(0, 0); } public Point(Point p) { this(p.x, p.y); } public Point(int x, int y) { this.x = x; this.y = y; } } © Prof. Dr. Björn Dreher 75 Liste Programmieren - Java 2 Klassen und Objekte 2.6 Objekte erzeugen und zerstören Anderen Konstruktor der gleichen Klasse aufrufen Einschränkungen Aufruf von this() muss in der ersten Zeile stehen Als Parameter können an this() keine Objektattribute übergeben werden Attribute sind möglicherweise noch nicht präsent Das Objekt wird gerade erst initialisiert Möglich sind allerdings statische Konstanten class Socke { final int ringelAnzahl = 4; static final int RINGEL_ANZAHL = Socke( String g, int anzRingel ) Socke( String f ) { // this( f, ringelAnzahl ); // this( f, RINGEL_ANZAHL ); // } } © Prof. Dr. Björn Dreher Liste Programmieren - Java 4; { ... } nicht erlaubt das geht statt dessen 76 22 2 Klassen und Objekte 2.6 Objekte erzeugen und zerstören Default Initialisierung Alle Attribute eines Objektes werden grundsätzlich mit Default-Werten initialisiert Primitive Datentypen: 0 oder false Referenzen: null Von Java garantiert Initialisierung von Klassenattributen (statische Attribute) Automatisch wie oben; nur einmal, wenn Klasse zum ersten Mal geladen wird Oder explizit: class StaticInit { static int i; } static { i = 2; } © Prof. Dr. Björn Dreher Liste Programmieren - Java 77 2 Klassen und Objekte 2.6 Objekte erzeugen und zerstören Finale Werte können auch noch im Konstruktor gesetzt werden Nicht gut für Lesbarkeit des Codes class VariableConstant { final static int MWST; // hier steht nicht = irgendwas final String ISBN; // hier auch nicht. static { if ( 2 > 1 ) MWST = 7; else MWST = 16; } VariableConstant() { ISBN = "3572100100"; } public static void main( String args[] ) { System.out.println( MWST ); // 7 } } System.out.println( new VariableConstant().ISBN ); // 3572100100 © Prof. Dr. Björn Dreher Liste Programmieren - Java 78 23 2 Klassen und Objekte 2.6 Objekte erzeugen und zerstören Instanzeninitialisierer ... private static final int NUMPTS = 100; private int[] data = new int[NUMPTS]; { for (int i = 0; i < NUMPTS; i++) data[i] = i; } ... Es kann mehrere geben Werden zu Beginn des Konstruktors ausgeführt Nützlich für komplexe Initialisierungen Hauptanwendung: Unterstützung anonymer innerer Klassen (besprechen wir später) © Prof. Dr. Björn Dreher Liste Programmieren - Java 79 2 Klassen und Objekte 2.6 Objekte erzeugen und zerstören Zerstören von Objekten Keine explizite Freigabe von Objekten wie in C (free) oder C++ (delete) Nicht mehr verwendete Objekte (welche, zu denen es keine Referenzen mehr gibt) werden von der Garbage Collection freigegeben Thread niedriger Priorität, der immer im Hintergrund läuft Referenz ungültig machen: Auf null setzen In Java gibt es keine Destruktoren wie in C++ Teilweiser Ersatz Methode finalize() Keine Garantie, dass sie überhaupt einmal aufgerufen wird Alles in allem: Eine bequeme Lösung für den Programmierer © Prof. Dr. Björn Dreher Liste Programmieren - Java 80 24 Liste Programmieren – Java Überblick: 2. Klassen und Objekte 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Einleitung Kapselung Ein Stack von chars Klassen Statische Methoden und Attribute Objekte erzeugen und zerstören Objektreferenzen © Prof. Dr. Björn Dreher Liste Programmieren - Java 81 2 Klassen und Objekte 2.7 Objektreferenzen Null-Referenz Point p = new Point(); p ist eine Referenz Erhält Wert erst als Ergebnis des new-Operators Point p = null; null ist vordefinierte Konstante: null-Referenz Sagt, dass p auf kein Objekt verweist Typenlos: Kann jeder Referenz zugewiesen werden Ist nicht in primitiven Datentyp 0 umwandelbar Aufruf einer Methode oder eines Attributs einer mit null initialisierten Referenz NullPointerException © Prof. Dr. Björn Dreher Liste Programmieren - Java 82 25 2 Klassen und Objekte 2.7 Objektreferenzen Null-Referenz Überprüfung, ob Referenz initialisiert ist: if ( p != null && p.x >=10 ) ... Zuweisung an Referenzen Mehrere Referenzen können auf dasselbe Objekt zeigen Point p = new Point(); Point q = p; q erhält den Wert der Referenz p zugewiesen Zeigt auf dasselbe Objekt Objekt wird nicht kopiert! Änderung über Referenz p betrifft genauso Referenz q p.x = 10; System.out.println(q.x); © Prof. Dr. Björn Dreher // Resultat ist 10 Liste Programmieren - Java 83 2 Klassen und Objekte 2.7 Objektreferenzen Vergleich mit der Kopie von primitiven Werten Primitive Variablen werden per Wert kopiert int i = 2; int j; ... j = i; System.out.println(j); i = 3; System.out.println(j); © Prof. Dr. Björn Dreher // Erhält Kopie des ursprünglichen // Wertes zugewiesen // Ergebnis ist 2 // Ergebnis ist immer noch 2 Liste Programmieren - Java 84 26 2 Klassen und Objekte 2.7 Objektreferenzen Gleichheit von Objekten Zuweisung mit = schafft zusätzliche Kopie einer Referenz auf ein bereits existierendes Objekt Vergleichsoperator == testet für alle Datentypen die Gleichheit der entsprechenden Werte Bei primitiven Datentypen liefert das erwartete Ergebnis Bei Referenzen werden die Werte der Referenzen verglichen Gleichheit, wenn sie auf dasselbe Objekt zeigen Es wird nicht geprüft, ob die beiden referenzierten Objekte dieselben Werte besitzen! Point p = p.x = 12; Point q = Point r = r.x = 12; if ( p == new Point(); p; new Point(); q ) // // if ( p == r ) // // // © Prof. Dr. Björn Dreher ist wahr, da p und q dasselbe Objekt referenzieren ist falsch, da p und r zwei verschiedene Punkt-Objekte referenzieren, die zufällig dieselben Koordinaten haben Liste Programmieren - Java 85 2 Klassen und Objekte 2.7 Objektreferenzen Gleichheit von Objekten: Die Methode equals() Jede Klasse kann diese Methode implementieren, um die Gleichheit zweier verschiedener Objekte festzustellen Damit definiert equals(), was für eine bestimmte Klasse Gleichheit bedeutet Point a = new Point( 10, 10 ); Point b = new Point( 10, 10 ); if ( a == b ) // false ... if ( a.equals(b) ) // true ... Bereits die Wurzelklasse Object definiert eine Methode equals() Ergebnis ist true, wenn beide Argumente dasselbe Objekt referenzieren public boolean equals( Object obj ) { return ( this == obj ); } © Prof. Dr. Björn Dreher Dasselbe, wie Vergleichsoperator (==) Liste Programmieren - Java 86 27 2 Klassen und Objekte 2.7 Objektreferenzen Gleichheit von Objekten: Die Methode equals() Will man die eigenen Objekte auf Gleichheit vergleichen, muss man equals() überschreiben Für die Point-Klasse public boolean equals( Object obj ) { if ( obj instanceof Point ) { Point pt = (Point)obj; return (x == pt.x) && (y == pt.y); } return super.equals(obj); } © Prof. Dr. Björn Dreher Liste Programmieren - Java 87 28