Repetitorium Informatik (Java) Tag 6 Lehrstuhl für Informatik 2 (Programmiersysteme)
Übersicht 1 Klassen und Objekte Objektorientierung Begrifflichkeiten Deklaration von Klassen Instanzmethoden/-variablen Klassenmethoden/-variablen Selbstreferenz: this 2 Instanziierung Objekte Instanziierung Konstruktoren Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 2 / 23
Übersicht 1 Klassen und Objekte Objektorientierung Begrifflichkeiten Deklaration von Klassen Instanzmethoden/-variablen Klassenmethoden/-variablen Selbstreferenz: this 2 Instanziierung Objekte Instanziierung Konstruktoren Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 3 / 23
Motivation Bisher: nur primitive vordefinierte Datentypen int, double, boolean, (String,)... alle diese Datentypen speichern jeweils eine Information. Aber: Wie kann man unterschiedliche Informationen, die logisch zusammengehören, auch gemeinsam verwalten? Jetzt: eigene, zusammengesetzte Datentypen ( Datenstrukturen ) Einstieg in die Objekt-Orientierte Programmierung (OOP) Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 4 / 23
Objektorientierte Programmierung (OOP) Objektorientierte Programmierung Programmierparadigma Programmiersprachen: Java, C++, C#,... Objektorientierung: Daten und zugehörige Operationen (die auf diesen Daten arbeiten ), zu einer logischen und organisatorischen Einheit zusammenfassen Klasse was logisch zusammengehört, wird (zu einer Klasse) zusammengefasst; was nicht zusammengehört, wird voneinander (in verschiedene Klassen) getrennt. Klassen sind nach außen hin gekapselt, so dass der Zugriff auf ihre Daten (insbesondere Manipulation) eingeschränkt und kontrolliert werden kann OOP vereinfacht Modularisierung und Wiederverwendung von Software Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 5 / 23
Klasse und Objekt Klasse: Konzept der OOP zur Definition neuer Datentypen Schablone oder Bauplan Objekt/Instanz: Konkretes Exemplar einer Klasse ( Ausprägung ) I.d.R. werden während der Ausführung des Programms mehrere Objekte einer Klasse erzeugt und verwendet Klassendefinition legt fest: Attribute: Variablen für zu speichernde Daten (in Objekt bzw. Klasse) Methoden: zur Verfügung stehende Operationen Konstruktoren: spezielle Methoden zur Erzeugung eines neuen Objekts Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 6 / 23
Typisches Beispiel: Bankkonto Klasse Bankkonto Attribute: Kontonummer Eigentümer Kontostand Methoden: einzahlen abheben anzeigenkontostand Objekte/Instanzen der Klasse Bankkonto Programmcode Ausführung Konto 08154711 08154711 Petra Musterfrau 815.47 Euro Konto 47110815 47110815 Hans Mustermann 4711.08 Euro... Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 7 / 23
Realweltliches Beispiel: Mitarbeiter Klasse Mitarbeiter Attribute: Name Monatsgehalt Abteilung... Methoden: befördern entlassen... Objekte der Klasse Mitarbeiter Peter, 3 500 Euro, Verwaltung,... Hans, 2 700 Euro, Außendienst,... befördern... Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 8 / 23
Deklaration von Klassen Java kennt nichts außerhalb von Klassen Prinzip bereits bekannt Syntax (vereinfacht) <Modifizierer > class <Klassen - Name > { <Definitionen > Modifizierer: Zunächst nur public Datei muss genauso heißen wie die Klasse selbst Klassen-Name: Buchstaben, Zahlen und (bestimmte) Sonderzeichen Konvention: Beginnend mit Großbuchstaben, nur Buchstaben Definitionen: Deklaration von Attributen (Variablen) Methoden-Definitionen Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 9 / 23
Attribute Bisher: lokale Variablen innerhalb von Methoden und Blöcken Jetzt: Attribute (oft auch Felder genannt) prinzipiell wie lokale Variablen Syntax zur Deklaration und Initialisierung wie bei lokalen Variablen Unterschied: Werden direkt in der Klasse deklariert Zugriff aus Methoden möglich (Details gleich) Beispiel public class Rechteck { int breite ; int hoehe ; Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 10 / 23
Statische vs. nicht-statische Variablen/Methoden Bereits bekannt: Unterscheidung: Objekt (Instanz) Klasse Jetzt: Unterscheidung: Instanzmethode/-variable Klassenmethode/-variable Instanzmethoden/-variablen: nicht-statisch Gehören jeweils zu einem konkreten Objekt (einer konkreten Instanz) jedes Objekt hat jeweils seine eigene Instanzmethode/-variable individuelle Wertebelegungen der Instanzvariablen in jedem Objekt Zugriff auf Instanzmethoden/-variablen daher nur mit (expliziter oder impliziter) Angabe der konkreten Instanz möglich Klassenmethoden/-variablen: statisch Gehören zur ganzen Klasse daher mit Schlüsselwort static deklariert jedes Objekt sieht die gleiche (genauer: identische) Klassenvariable alle Instanzen gleicher Klasse teilen sich die gemeinsame Klassenvariable Zugriff auf Klassenmethoden/-variablen daher ohne Angabe einer konkreten Instanz möglich Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 11 / 23
Zugriff auf Instanzmethoden/-variablen von außerhalb der Klasse <Objekt - Variable >. < Methoden - Name >( < Parameter >) // explizite Angabe der <Objekt - Variable >. < Variablen - Name > // konkreten Instanz ( vor.) notwendig von innerhalb der Klasse <Methoden - Name >( < Parameter >) // die konkrete Instanz ist implizit das <Variablen - Name > // aktuelle Objekt -> Angabe kann daher entfallen Beispiel Beispiel: Methode length() der Klasse String ist Instanzmethode Aufruf (hier von außerhalb) nur an konkreter Instanz sinnvoll, weil verschiedene Zeichenketten meist unterschiedliche Längen haben String s1 = " Hallo?"; String s2 = " Hallo Welt!"; int l1 = s1. length (); // l1 hat den Wert 6 int l2 = s2. length (); // l2 hat den Wert 11 Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 12 / 23
Beispiel: Rechteck Klasse Rechteck Attribut: breite Attribut: hoehe Methode: flaeche() Statisch oder nicht-statisch? Attribute: Instanzvariablen (jedes Rechteck hat individuelle breite u. hoehe) Methode: Instanzmethode (Zugriff auf Instanzvariablen notwendig) Mögliche Umsetzung public class Rechteck { int breite ; // Instanzvariable -> ohne " static " int hoehe ; // Instanzvariable -> ohne " static " public int flaeche () { // Instanzmethode -> ohne " static " return breite * hoehe ; Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 13 / 23
Zugriff auf Klassenmethoden/-variablen von außerhalb der Klasse <Klassen - Name >. < Methoden - Name >( < Parameter >); // explizite Angabe der <Klassen - Name >. < Variablen - Name >; // enthaltenden Klasse ( vor.) notwendig von innerhalb der Klasse <Methoden - Name >( < Parameter >); // die konkrete Klasse ist implizit die <Variablen - Name >; // aktuelle ( umgebende ) Klasse -> Angabe kann entfallen Beispiel Beispiel: Methode parseint() der Klasse Integer ist Klassenmethode Aufruf ohne konkrete Instanz (also direkt über den Klassennamen) möglich int zahl = Integer. parseint (" 13"); Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 14 / 23
Beispiel: Zugriffe klassenweit zählen Ziel: Zählen aller Aufrufe der Methode flaeche() der Klasse Rechteck, unabhängig davon, von welcher Instanz die Fläche erfragt wurde (z.b. zu Protokollzwecken) Klassenvariable vom Typ int: zugriffe Mögliche Umsetzung public class Rechteck { int breite ; int hoehe ; static int zugriffe = 0; Vorstellung zur Laufzeit Rechteck-Objekt 1 breite = 47 hoehe = 11 zugriffe Rechteck-Objekt 2 breite = 8 hoehe = 15 zugriffe public int flaeche () { zugriffe ++; return breite * hoehe ; Rechteck-Klasse zugriffe = 3 Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 15 / 23
Beispiel: Zugriffe klassenweit zählen Beispiel Rechteck r1; Rechteck r2; //... hier fehlt noch das Erzeugen der Objekte... System. out. println (" Anzahl der Zugriffe : " + Rechteck. zugriffe ); r1. flaeche (); System. out. println (" Anzahl der Zugriffe : " + Rechteck. zugriffe ); r2. flaeche (); System. out. println (" Anzahl der Zugriffe : " + Rechteck. zugriffe ); Ausgabe Anzahl der Zugriffe: 0 Anzahl der Zugriffe: 1 Anzahl der Zugriffe: 2 Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 16 / 23
Selbstreferenz: this Beispiel Schlüsselwort this Referenz auf sich selbst in jedem Objekt wie eine spezielle Variable alternativer Zugriff auf die eigenen Instanzmethoden/-variablen hilfreich bei Namenskonflikt zwischen lokalen Variablen und Attributen <Variable> lokale Variable (hier z.b.: Parameter) this.<variable> Attribut int breite ; public void setbreite ( int breite ) { if ( breite > 0) { this. breite = breite ; // Zuweisung von Parameter auf Attribut Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 17 / 23
Übersicht 1 Klassen und Objekte Objektorientierung Begrifflichkeiten Deklaration von Klassen Instanzmethoden/-variablen Klassenmethoden/-variablen Selbstreferenz: this 2 Instanziierung Objekte Instanziierung Konstruktoren Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 18 / 23
Instanziierung: Analogie zu Arrays Bereits bekannt: Erzeugung von Arrays nach Deklaration (und vor Verwendung) notwendig Instanziierung mit dem Schlüsselwort new Beispiel int [] zahlen = new int [10]; new erzeugt neues Objekt im Speicher (genauer: Heap) Objekt-Variable (hier: zahlen ) beinhaltet Referenz auf das neue Objekt Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 19 / 23
Instanziierung von Klassen Anlegen einer neuen Instanz mit new (analog zu Arrays) Runde Klammern nach Klassennamen (anders als bei Arrays) ist eigentlich Methodenaufruf daher auch Übergabe von Parametern möglich Beispiel: Klasse Rechteck public class Rechteck { int breite ; int hoehe ; public void foo () { Rechteck r = new Rechteck (); Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 20 / 23
Verwendung von Objekt-Variablen Objekt-Variablen können wie andere Variablen (mit primitivem Datentyp) verwendet werden Beispiel: Übergabe als Parameter public class Rechteck { int breite ; int hoehe ; public class Test { public static void ausgabe ( Rechteck r) { System. out. println (" Breite : " + r. breite + ", Hoehe : " + r. hoehe ); public static void main ( String [] args ) { Rechteck r = new Rechteck (); r. breite = 13; r. hoehe = 3; ausgabe (r); Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 21 / 23
Konstruktoren Dienen meist zur Initialisierung einzelner Attribute bei der Instanziierung Sind spezielle Methoden, die bei der Instanziierung ausgeführt werden Konstruktorname und Klassenname müssen identisch sein Übergabe von Parametern wie bei normalen Methoden möglich Konstruktoren haben jedoch keinen Rückgabetyp (auch nicht void!) Falls kein expliziter Konstruktor definiert wird, gibt es automatisch einen impliziten leeren Standard-Konstruktor (ohne Parameter und ohne weitere Funktionalität) Achtung! Durch die Definition eines (expliziten) Konstruktors entfällt automatisch der Standard-Konstruktor und muss ggf. neu definiert werden. Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 22 / 23
Beispiel: Rechteck Konstruktor soll breite und hoehe jeder Instanz auf jeweils vorgegebene (individuelle) Werte initialisieren Klasse Rechteck public class Rechteck { int breite ; int hoehe ; public Rechteck ( int breite, int hoehe ) { this. breite = breite ; this. hoehe = hoehe ; public static void main ( String [] args ) { Rechteck r = new Rechteck (13, 3); Repetitorium Informatik Informatik 2 WS 2015/16 Tag 6 Folie 23 / 23