Klassen und Objekte Wiederholungsvorlesung Programmiermethodik und Compilerbau, 2003 Klassen und Objekte(1) • • Eine Klasse definiert einen neuen, höheren Datentyp Eine Klasse besteht aus – Variablen (Daten...) – Methoden (Manipulation dieser Daten) • Definition einer Klasse in Java: Schlüsselwort class class Person { String name; int Alter; Variablen Methode public void ausgabe() { ... } } Programmiermethodik und Compilerbau, 2003 Klassen und Objekte(2) • Ein Objekt ist eine Instanz einer Klasse ? Attribute einer Person: Name, Alter Objekt ist Instanz einer Klasse Xaver, 23 Jahre Eine Klasse Ein Objekt Programmiermethodik und Compilerbau, 2003 Klassen und Objekte(3) • Damit: Eine Klasse ist sozusagen ein „Bauplan“ für ein konkretes Objekt • Um in Java ein Objekt einer Klasse zu erzeugen, dient das Schlüsselwort new: class Person { ... } // ... Beliebige Programmstelle... Person xaver = new Person(); Programmiermethodik und Compilerbau, 2003 Erzeugung von Objekten • Erzeugung eines Objekts: Person xaver = new Person(); Klassentyp Referenz auf ein Person-Objekt Mit new ein Objekt erzeugen • Zugriff auf die Eigenschaften eines Objekts: xaver.name = “Xaver“; xaver.alter = 23; Programmiermethodik und Compilerbau, 2003 Methoden • Methoden: Teilprogramme, die die Daten eines Objektes bearbeiten: • class Person { int alter; String name; Methode, gibt die jeweilige Person aus public void ausgabe() { System.out.println(name+ “ ist “+ alter+“ Jahre alt.“) } } Innerhalb einer Klasse kann auf die Attribute einfach zugegriffen werden Programmiermethodik und Compilerbau, 2003 Methodenaufruf • Aufruf einer Methode public static void main(String[] args) { Person p1 = new Person(); Person p2 = new Person(); p1.name = “Xaver“; p1.alter = 23; p2.name = “Yvonne“; p2.alter = 21; p1.ausgabe(); p2.ausgabe(); Xaver ist 23 Jahre alt. Yvonne ist 21 Jahre alt. } Programmiermethodik und Compilerbau, 2003 Konstruktion von Objekten • Zur Initialisierung von Objekten gibt es spezielle Methoden: Methode ohne Rückgabewert, Name gleich der Klasse: class Person { String name; Person(String n) { name = n; } Ein Konstruktor (denn er "konstruiert" das Objekt) } Kontruktoraufruf bei ... Erzeugung des Objektes Person p3 = new Person("Xaver"); Programmiermethodik und Compilerbau, 2003 Konstruktion von Objekten • Mehrere Konstruktoren erlaubt • Gegenseitiges Aufrufen möglich • Default-Konstruktor: Jede Klasse besitzt automatisch einen Konstruktor ohne Parameter class Person { String name; Konstruktor ruft mit Schlüsselwort "this" weiteren Konstruktor auf Person() { this("Namenlos"); } Person(String name) { this.name = name; } } Programmiermethodik und Compilerbau, 2003 Selbstreferenz this • this bezeichnet immer das aktuelle Objekt • Verwendungsbeispiele: – this zur Auflösung von Namenskonflikten – this zum Aufrufen eines weiteren Konstruktors "Rufe den Konstruktor dieser Klasse auf, die einen String als class Person { String name; Parameter hat" Person() { this("Namenlos"); } Person(String name) { this.name = name; Namenskonflikt: Attribut } } der Klasse und übergebener Parameter Programmiermethodik und Compilerbau, 2003 public und private Public: Zugriff auf eine Variable / Methode ist von außerhalb erlaubt Private: Zugriff auf eine Variable / Methode ist nur innerhalb der Klasse erlaubt Damit kann der Zugriff auf die Eigenschaften eines Objektes eingeschränkt werden Programmiermethodik und Compilerbau, 2003 public und private • Schlechtes Beispiel: public class Rechteck { public int hoehe, breite, flaeche; } ... Rechteck r = new Rechteck(); r.hoehe = 10; r.breite = 5; r.flaeche = 42; Freier Zugriff auf alle Felder des Objekts führt hier zu einem inkonsistenten Objekt! Programmiermethodik und Compilerbau, 2003 public und private • Besser: "Verstecken" der Eigenschaften, dafür Methoden für den Zugriff, um Zustand konsistent zu halten: public class Rechteck { private int hoehe, breite, flaeche; public void setHoehe(int hoehe) { this.hoehe = hoehe; flaeche = breite*hoehe; Bei Änderung der Höhe } Fläche neu berechnen public int getHoehe() { return hoehe; } } Programmiermethodik und Compilerbau, 2003 public und private • Public/Private bei Methoden: – private: Methode kann nur innerhalb der eigenen Klasse aufgerufen werden – public: Methode ist auch außerhalb der eigenen Klasse sichtbar • Public bei Klassen: Klasse ist nach außen sichtbar (z.b. bei mehreren Klassendefinitionen in einer Datei) • "Geheimnisprinzip" Programmiermethodik und Compilerbau, 2003 Referenzen (Verweise) • In Java sind Variablen eines Klassentyps immer Referenzen auf das eigentliche Objekt: // Was ergibt dieses Programm? public class Test { int wert=0; public static void main(String[] args) { Test t1 = new Test(); Test t2 = t1; t1.wert = 5; System.out.println(t2.wert); } } Programmiermethodik und Compilerbau, 2003 Referenzen (Verweise) • Situation des vorherigen Programms zeichnerisch: t1 Test wert: 5 t2 • t1.wert und t2.wert bezeichnen dieselbe Variable! Programmiermethodik und Compilerbau, 2003 Klassenmethoden(1) Problem: Wenn Code immer mit einem Objekt verknüpft ist, wo kommt denn dann das erste Objekt her? Antwort: Es gibt nicht nur Objektmethoden, sondern auch Klassenmethoden und Klassenvariablen. Klassenmethoden können ausgeführt werden, ohne daß ein Objekt der jeweiligen Klasse existiert. Klassenvariablen existieren genau einmal in der jeweiligen Klasse. Programmiermethodik und Compilerbau, 2003 Klassenmethoden(2) Definition einer Klassenmethode: static void mache_etwas() { ... } Definition einer Klassenvariable: static int personenzahl = 0; Da Klassenmethoden unabhängig von Objekten aufgerufen werden können, dürfen sie natürlich nicht auf Objektvariablen zugreifen. Programmiermethodik und Compilerbau, 2003 Klassenmethoden(3) • Aufruf von Klassenmethoden class Hilfsroutinen { public static int min(int a, int b) { if (a>b) return b; else return a; } } public class MeineKlasse { public static void main(String[] args) { int a = Hilfsroutinen.min(4,7); System.out.println(a); } } Aufruf einer static-Methode: Klassenname.methodenname(...); Programmiermethodik und Compilerbau, 2003 Klassenvariablen Beispiel: Zählen von Objektinstanzen Klasse public class Person { static int personenzahl=0; public static void main(String[] args) { Person p1 = new Person("Xaver"); Person p2 = new Person("Yvonne"); System.out.println(personenzahl); } public String name; Objekt Person(String name) { this.name = name; personenzahl++; } } Programmiermethodik und Compilerbau, 2003 personenzahl == 1 personenzahl == 2 Ein Zeichenstift(1) Gegebene Funktionen zum Zeichnen auf einer Fläche: // erzeugt eine Ausgabefläche Bildschirm.initialisieren(); // zeichnet eine Linie von (x1,y1) nach (x2,y2) Bildschirm.zeichneLinie(x1,y1,x2,y2); Programmiermethodik und Compilerbau, 2003 Ein Zeichenstift(2) (0,0) X Y Attribute eines Stiftes: Position, Richtung Methoden: fahre(int distanz); drehe(int grad) (600,400) Programmiermethodik und Compilerbau, 2003