Objektorientierte Programmierung PDF
Document Details

Uploaded by TriumphalUnderstanding8738
Philipps-Universität Marburg
Prof. Christoph Bockisch
Tags
Summary
Die PDF-Präsentation von Prof. Christoph Bockisch von der Universität Marburg behandelt das Thema Objektorientierte Programmierung (OOP) in Java. Es werden wichtige Konzepte wie Datenfelder, Methoden, Klassen und das Schlüsselwort 'this' erklärt, um Studenten eine Einführung in die Grundlagen der Objektorientierung zu geben.
Full Transcript
Objektorientierte Programmierung 332 5.3 Zugriff auf Datenfelder Ist ein Objekt erzeugt und initialisiert worden, ist ein Zugriff auf die Datenfelder schreibend und lesend möglich. Hierzu verwendet man typischerweise eine Variable gefolgt von einem Punkt...
Objektorientierte Programmierung 332 5.3 Zugriff auf Datenfelder Ist ein Objekt erzeugt und initialisiert worden, ist ein Zugriff auf die Datenfelder schreibend und lesend möglich. Hierzu verwendet man typischerweise eine Variable gefolgt von einem Punkt und den Namen des Datenfelds. Student s1 = new Student("Max", "Mustermann", 12, 12345); Student s2 = new Student("Ute", "Musterfrau", 13, 54321,3); int f = s1.fb; // Lesender Zugriff s2.fachsemester = 10; // Schreibender Zugriff Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 333 Zugriff auf Felder: ja oder nein? Oft ist es gefährlich, Datenfelder der Objekte direkt zu verändern. Dadurch kann ein Objekt mit einem nicht erlaubten Zustand entstehen. Beispiel (Klasse Konto) Ein direkter Zugriff auf das Datenfeld kontoStand könnte dazu führen, dass dies ohne Überweisung, Einzahlung oder Abheben geändert wurde. Zugriffsrechte public und private public erlaubt wie bisher den uneingeschränkten Zugriff auf die Datenfelder. private nur dann, wenn man sich in der Klasse, z. B. in einer Methode, befindet. Tatsächlich gibt es noch mehr Optionen für die Zugriffsrechte, auf die wir später zu sprechen kommen. Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 334 Geschützte Datenfelder Im Allgemeinen sollten alle Datenfelder einer Klasse als private deklariert werden. class Konto{ private String kontoNr; private double kontoStand; private int kundenNr; public void einzahlen(double geld) { … } public double abheben(double wunschBetrag) { … } public double getKontoStand() { … } } Damit ist der Zugriff auf die Datenfelder nur noch innerhalb der Klasse möglich. Den Zugriff von außerhalb ermöglichen wir indirekt über die public-Methoden. Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 335 5.4 Objektmethoden Die Operationen des neuen Datentyps, der durch die Klasse bereitgestellt wird, werden durch Objektmethoden realisiert. Objektmethoden werden innerhalb des Klassenrumpfs definiert Diese Methoden haben stets Zugriff auf alle Datenfelder eines Objekts als wären es lokale Variablen der Methode. Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 336 Beispiel class Konto { private String kontoNr; private double kontoStand; private int kundenNr; public void einzahlen(double betrag) { if (betrag > 0.0) kontoStand += betrag; } public double abheben(double wunschBetrag) { …. } public double getKontoStand() { return kontoStand; } } Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 337 Aufruf von Objektmethoden Objektmethoden können nur im Kontext eines Objekts genutzt werden. Beim Aufruf wird erst das Objekt dann ein Punkt und dann der Methodenname mit den Parametern angegeben. Damit kann in der Methode auf alle Datenfelder des Objekts lesend und schreibend zugegriffen werden. Beispiel Konto k = new Konto("12345", 0.0, 7); // Hier wird ein neues Konto mit Nummer 12345 für Kunde mit // Kundennummer 7 erstellt. Der Kontostand ist am Anfang auf 0 k.einzahlen(1000.0); // In der Methode einzahlen kann jetzt auf die Datenfelder des Kontos // zugriffen werden, auf das k verweist.... System.out.println("Aktueller Kontostand: " + k.getKontoStand()); Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 338 5.5 Das Schlüsselwort this Wie referenziere ich mich selbst? Problem Parametervariablen einer Methode und Datenfelder einer Klassen können den gleichen Namen haben. à Namenskonflikt Wie kann man den Namenskonflikt auflösen? Lösung: Verwendung von this Durch das Schlüsselwort this bekommt man die Referenz des Objekts, in dem man sich befindet. this kann in der Klasse wie eine Variable vom Typ der Klasse verwendet werden. Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 339 Beispiel Anwendung von this in der Klasse Konto zur Auflösung von Namenskonflikten class Konto { private String kontoNr; private double kontoStand; private int kundenNr; Konto(String kontoNr, double ks, int kundenNr) { this.kontoNr = kontoNr; kontoStand = ks; this.kundenNr = kundenNr; } … } Zugriff auf die Zugriff auf das Parametervariable Datenfeld Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 340 Selbstreferenz eines Objekts Problem Wie kann ein Objekt in einer Methode eine Referenz auf sich selbst als Ergebnis liefern? Lösung: Verwendung von this Durch das Schlüsselwort this bekommt man die Referenz des Objekts, in dem man sich befindet. this kann als Ergebnis einer Methode nach außen geliefert werden. Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 341 Beispiel Anwendung von this in der Klasse Konto als Selbstreferenz class Konto { private double kontoStand; … Konto einzahlen (double betrag){ // neuer Rückgabetyp!! kontoStand += betrag; return this; } … } this liefert die Referenz auf das Objekt Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 342 Selbstbezug bei Konstruktoren Problem Konstruktoren sehen oft sehr ähnlich aus und unterscheiden sich oft nur in einem Parameter. Kann bei der Bereitstellung von Konstruktoren auch ein anderer Konstruktor benutzt werden? Lösung: Verwendung von this(…) Hierdurch kann in einem Konstruktor ein anderer Konstruktor der gleichen Klassen aufgerufen werden. this wird dann wie ein Methodenname genutzt. Nebenbedingung Der this-Konstruktoraufruf muss die erste Anweisung in einem Konstruktor sein. Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 343 Beispiel Anwendung von this zum Aufruf eines anderen Konstruktors class Konto { private String kontoNr; private double kontoStand; private int kundenNr; Konto(String kontoNr, double ks, int kundenNr) { this.kontoNr = kontoNr; kontoStand = ks; this.kundenNr = kundenNr; } Konto(String kontoNr, int kundenNr) { this(kontoNr, 0, kundenNr); } } Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 344 5.6 Das Schlüsselwort static Das Schlüsselwort static kann vor einer Methode, einem Datenfeld, (und einem Initialisierungsblock einer Klasse à wird nicht in dieser Vorlesung besprochen) stehen. Alle mit static gekennzeichneten Komponenten einer Klasse, sind Bestandteile der Klasse. Diese Datenfelder und Methoden gehören nicht zu einem Objekt der Klasse. Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 345 static Datenfelder Manchmal werden Datenfelder benötigt, die unabhängig von den Objekten einer Klasse sind. Für alle Objekte der Klasse sollen die Felder den gleichen Wert haben. In der Klasse Konto soll der Dispo als statisches Feld gespeichert werden. Solche Felder können durch das Schlüsselwort static definiert werden. static double dispo = 5000.0; Oft handelt es sich dabei um Konstanten, weshalb static zusammen mit final benutzt wird. static final double PI = 3.14; Der Zugriff von außerhalb der Klasse erfolgt durch den Namen der Klasse: Konto.dispo Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 346 static Methoden Klassenmethoden, die unabhängig von Objekten einer Klasse sind, werden ebenfalls mit dem Schlüsselwort static deklariert. In diesen Methoden steht kein „this“ zur Verfügung. Sie dürfen nur auf static Felder und Methoden der Klasse zugreifen. So enthält Java eine Klasse Math, in der nützliche mathematische Funktionen wie z. B. sin, cos, max, min, random, etc. als statische Methoden implementiert sind: static double random(){... }; Der Aufruf der Methode erfolgt über den Klassennamen, ohne dass ein Objekt von Math erzeugt werden muss: double zufall = Math.random(); Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 347 Unterschied zwischen Klassenmethoden und Objektmethoden Klassenmethoden Schlüsselwort static Zugriff auf Methoden und Datenfelder der eigenen Klasse nur wenn diese auch mit static deklariert sind. Aufruf (typischerweise) über den Klassennamen: bspw. Math.sqrt(2) Klassenname kann innerhalb der Klasse aber auch weggelassen werden Genauso für Klassen-Felder: bspw. System.out Objektmethoden besitzen nicht das Schlüsselwort static. Diese Methoden haben stets Zugriff auf alle Datenfelder und Methoden des Objekts und der zugehörigen Klasse. Aufruf einer Objektmethode erfolgt über ein Objekt Beispiel: meinKonto.einzahlen(10000), out.println("Hallo OOP") Genauso für Objekt-Felder: student.vorname Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 348 static und private Datenfelder Problem Man möchte static-Datenfelder nutzen, aber den Gebrauch außerhalb der Klasse verbieten. Lösung Dann ist es sinnvoll zusätzlich den Modifier private zu benutzen. private static double dispo = 5000.0; Damit wird eine unkontrollierte Veränderung des Datenfelds verhindert, da nur static -Methoden der Klasse Zugriff auf das Datenfeld haben. Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 349 Geheimnis gelüftet - print Bisher haben wir folgende Methode zur Ausgabe einer Zeichenkette benutzt. System.out.println("Hallo Welt"); Was steckt dahinter? System ist eine Klasse System hat ein statisches Datenfeld out Der Typ des Datenfelds out ist die Klasse PrintStream. Die Klasse PrintStream hat Objektmethoden print und println. Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 350 5.7 Die main-Methode in Java Bisher haben wir in der Vorlesung jshell benutzt. Vorteil: Schnelles und einfaches Erstellen von Java-Programmen Ohne Verwendung der jshell muss es eine main-Methode geben; die Klasse enthaltende Klasse ist dann ausführbar. class Hallo { public static void main(String[] args) { System.out.println("Hallo Welt!"); } } Abspeicherung der Klasse in einer Datei mit dem Namen der Klasse und der Dateiendung "java". In unserem Fall Hallo.java. Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 351 Unter der Haube der JShell class Student { Student.java String vorname; String nachname; int matrnr; int fb; int fachsemester = 1; Student(String v, String n, int mnr, int f) { vorname = v; nachname = n; matrnr = mnr; class Temp { Temp.java fb = f; public static void main(String[] args) { } } Student s1 = new Student("Max", "Mustermann", 12, 12345); s1.fachsemester = 10; int f = s1.fb; } } Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 352 Unter der Haube der JShell class Student { Student.java String vorname; String nachname; int matrnr; Klassen werden behandelt int fb; als ob sie in einer eigenen int fachsemester = 1;.java-Datei stehen. JShell führt aus: Verhalten ist näherungsweise Student(String so: int f) { v, String n, int mnr, javac Student.java Alle direkt vorname = v; eingegebenen Befehle javac Temp.java nachname werden behandelt als= ob n; sie in der main-Methodematrnr = mnr; einer eigenen Java- java Temp Temp.java fb = f; class Temp { Klasse stehen. public static void main(String[] args) { } } Gegebenenfalls werden Semikolons am Student s1 = new Student("Max", "Mustermann", 12, 12345); Ende der Anweisungen ergänzt. s1.fachsemester = 10; int f = s1.fb; } } Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 353 Übersetzen und Ausführen in der Kommandokonsole Übersetzen des Programms durch Aufruf des java- Compilers in cmd. In dem Verzeichnis wurde die Datei Hallo.class erzeugt. Ausführen des Programms durch Aufruf von java. Die Java-Laufzeitumgebung startet das Programm Hallo mit dem Aufruf der main-Methode. Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 354 Übersetzen und Ausführen in der Kommandokonsole Übersetzen des Programms durch Aufruf des java- Die.java-Dateien werden in einem einfachen Compilers in cmd. Text-Editor (später: IDE) geschrieben. In dem Verzeichnis wurde die Datei Hallo.class erzeugt. Ausführen des Programms durch Aufruf von java. Die Java-Laufzeitumgebung startet das Programm Hallo mit dem Aufruf der main-Methode. Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 355 Aufbau der main-Methode public static void main(String[] args) {... } Was steckt hinter der main-Methode? Die Methode ist öffentlich nutzbar. Die Methode main ist eine statische Methode. Die Methode liefert kein Ergebnis. Die Methode besitzt genau eine Parametervariable mit dem Typ String[ ]. Damit kann man beim Aufruf des Programms beliebig viele Parameter vom Typ String der main-Methode übergeben. Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 356 Parameter args in main Folgendes Programm gibt alles aus, was in der Kommandozeile nach dem Programmnamen kommt. public class Echo { public static void main (String[] args) { for (String s: args) System.out.println(s); } } Kommandozeilen-Parameter werden zu Elementen des Array-Parameters von main. Beispiel Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 357 Eingabe von Zahlen Das Programm Euklid zur Berechnung des größten gemeinsamen Teilers soll zwei Zahlen übergeben bekommen. Folgender Aufruf java Euklid 152343 7439823 gibt folgende Ausgabe: ggt von 152343 und 7439823 ist gleich 9. Erforderlich ist dabei die Umwandlung von String nach int. Statische Methode parseInt(String s) aus der Klasse Integer Falls die Zeichenkette keine Zahl als Parameter hat, bekommt man eine Fehlermeldung, eine sogenannte Exception, geliefert. Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 358 Eingabe von Zahlen Das Programm Euklid zur Berechnung des größten gemeinsamen Teilers soll zwei Zahlen übergeben bekommen. Folgender Aufruf java Euklid 152343 7439823 gibt folgende Ausgabe: ggt von 152343 und 7439823 ist gleich 9. Erforderlich ist dabei die Umwandlung von String nach int. public Statische static void Methode main(String[] args) parseInt(String { der Klasse Integer s) aus int x = Integer.parseInt(args); Falls die Zeichenkette keine Zahl als Parameter hat, bekommt man int y = Integer.parseInt(args); eine Fehlermeldung, eine sogenannte Exception, geliefert. System.out.println("ggt von " + x + " und " + y + " ist " + ggt(x, y)); } Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 359 5.8 JavaDoc Kommentare für Klassen Spezielle Tags mit dem Präfix @ in Kommentaren für Klassen. Allgemein verwendbare Tags @author für Namen des Autors @version für die Version der Klasse/Methode @see für Verweise Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 360 Lesbarkeit von Programmen Die Kommentare für javadoc dienen primär den Benutzern von Klassen, um die Klasse korrekt anzuwenden. Die Kommentare werden im Normalfall nur für public Klassen, Methoden und Felder erzeugt. Trotzdem auch private Klassen, Methoden und Felder kommentieren! Aktualisierte Coding Conventions: siehe ILIAS Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge Objektorientierte Programmierung 361 Zusammenfassung Klassen in Java Definition eigener Datentypen Wertemenge Operationen Verwendung von Klassen Klassen als Datentypen Klassen als Objektfabriken Konzepte von Klassen Datenfelder und Methoden Konstruktoren Schlüsselwort static Prof. Christoph Bockisch ([email protected]) | Programmiersprachen und –werkzeuge