Übersicht. Informatik 2 Teil 1 Objektorientiertes Programmieren und Grundlagen von Java



Ähnliche Dokumente
Objektorientierte Programmierung

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Einführung in die Programmierung

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Computeranwendung und Programmierung (CuP)

Einführung in die Java- Programmierung

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Java: Vererbung. Teil 3: super()

Programmieren in Java

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Einführung in die Programmierung

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Vorkurs C++ Programmierung

Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Zählen von Objekten einer bestimmten Klasse

Diana Lange. Generative Gestaltung Operatoren

Programmierkurs Java

Objektorientierte Programmierung. Kapitel 12: Interfaces

5. Tutorium zu Programmieren

Abschnitt 12: Strukturierung von Java-Programmen: Packages

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

Programmierkurs Java

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Pakete dienen dazu, die Software eines Projektes in größere inhaltlich zusammengehörige Bereiche mit eigenem Namen einzuteilen (siehe Java API).

Java Kurs für Anfänger Einheit 5 Methoden

1 Vom Problem zum Programm

Primzahlen und RSA-Verschlüsselung

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

Praktikum Ingenieurinformatik. Termin 2. Verzweigungen (if-else), printf und scanf, while-schleife

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Autor: Michael Spahn Version: 1.0 1/10 Vertraulichkeit: öffentlich Status: Final Metaways Infosystems GmbH

Delegatesund Ereignisse

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Viele Bilder auf der FA-Homepage

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Enigmail Konfiguration

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Zwischenablage (Bilder, Texte,...)

5.5.8 Öffentliche und private Eigenschaften

Folge 18 - Vererbung

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

Workshop 6. Einführung in die objektorientierte Programmierung. Teil: Java mit BlueJ

5.4 Klassen und Objekte

Übungen zu C++ Kapitel 1

5. Abstrakte Klassen

2. Semester, 2. Prüfung, Lösung

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Vorlesung Informatik II

Professionelle Seminare im Bereich MS-Office

Vererbung & Schnittstellen in C#

Deklarationen in C. Prof. Dr. Margarita Esponda

Proseminar C-Programmierung. Strukturen. Von Marcel Lebek

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Einführung in die C++ Programmierung für Ingenieure

Vorkurs Informatik WiSe 15/16

Innere Klassen in Java

Testklausur 1 zur Vorlesung. Modellierung und Programmierung I. Dr. Monika Meiler Zeit: 60 Minuten

Graphic Coding. Klausur. 9. Februar Kurs A

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt

Anleitung über den Umgang mit Schildern

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Objektorientierte Programmierung OOP

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben

25 kann ohne Rest durch 5 geteilt werden! ist wahr

Visual Basic Express erstes Projekt anlegen

3 Objektorientierte Konzepte in Java

Testen mit JUnit. Motivation

Persönliche Zukunftsplanung mit Menschen, denen nicht zugetraut wird, dass sie für sich selbst sprechen können Von Susanne Göbel und Josef Ströbl

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

.NET Code schützen. Projekt.NET. Version 1.0

1 Mathematische Grundlagen

Javakurs für Anfänger

Modellierung und Programmierung 1

Rundung und Casting von Zahlen

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

Wie Sie mit Mastern arbeiten

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

4. BEZIEHUNGEN ZWISCHEN TABELLEN

Programmieren I. Kapitel 15. Ein und Ausgabe

Erwin Grüner

Probeklausur: Programmierung WS04/05

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Java Einführung Methoden in Klassen

Professionelle Seminare im Bereich MS-Office

Wie halte ich Ordnung auf meiner Festplatte?

Menü Macro. WinIBW2-Macros unter Windows7? Macros aufnehmen

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Transkript:

Übersicht 1.1 Warum objektorientierte Programmierung (OOP) 1.2 OOP-Grundlagen 1.3 Die Programmiersprache Java 1.4 Die Plattformunabhängigkeit von Java 1.5 Vergleich von Java und C 1.6 Primitive Datentypen 1.7 Syntax von Klassen 1.8 Methoden 1.9 Erzeugen von Objekten 1.10 Zugriff auf Objekteigenschaften 1.11 Der Konstruktor 1.12 Kapselung 1.13 Kapselung Beispiel-Schema 1.14 abgeleitete Klassen (Kindklassen), Vererbung 1.15 Kindklassen Überschreiben von Methoden 1.16 Die Methode main(), Klasseneigenschaften und - methoden 1.17 Die Standard-Ausgabe 1.18 Beispiel eines Java-Programms I 1.19 Beispiel eines Java-Programms II 1.20 Logikoperatoren und der Typ boolean 1.21 Pseudokonstanten, Schlüsselwort final 1.22 Packages verwenden 1.23 Packages erstellen 1.24 Bemerkungen zur Wortwahl Prof. Martin Trauth Folie 1 / 25

1.1 Warum objektorientierte Programmierung (OOP)? Im täglichen Leben gehen nur die wenigstens Menschen mit Elementen datenverarbeitender Systeme, wie Variablen oder Funktionen um, die ein Merkmal so genannter imperativer Programmiersprachen (wie C) sind. Statt dessen haben wir es mit Dingen zu tun man kann auch Objekte dazu sagen. Das können natürliche Dinge sein (z.b. Berge, Tiere), vom Menschen geschaffene (z.b. Maschinen, Gebäude) oder abstrakte Objekte, z.b. ein Bankkonto oder ein Fenster auf dem Bildschirm. OOP soll den datentechnischen Umgang mit diesen Dingen vereinfachen. Ein Ding hat Eigenschaften und Methoden. Nehmen wir einen Elefanten... Der Elefant hat beispielsweise die Eigenschaft Gewicht. Auch sein Standort ist eine seiner Eigenschaften. Oder die Anzahl seiner Beine (normalerweise 4, aber er könnte ja auch ein Invalide sein). Mit seinen Methoden kann er seine Eigenschaften verändern. Mit der Methode Fressen nimmt er an Gewicht zu. Mit Trinken auch. Er hat auch Methoden, die das Gewicht reduzieren, aber das lassen wir hier mal weg. Mit der Methode Gehen verändert er seinen Standort. Prof. Martin Trauth Folie 2 / 25

1.2 OOP - Grundlagen Auch bei der OOP verwendet man Objekteigenschaften und Objektmethoden. Sehr wichtig ist außerdem die Bauanleitung die jedes Objekt haben muss. Die meisten objektorientierten Programmiersprachen verwenden dafür den Begriff Klasse. Am Beispiel des Elefanten wäre die Klasse eine Bauanleitung für Elefanten. Die Klasse definiert welche Eigenschaften und Methoden alle Objekte haben, die zu dieser Klasse gehören. Im Falle von Elefanten definiert die Klasse also, dass ein Elefant eine Methode Fressen hat und dass er die Eigenschaft Gewicht besitzt. Wenn nun ein Objekt der Klasse Elefant erzeugt wird, dann haben wir die Repräsentation eines individuellen Elefanten, mit individuellem Gewicht und einer individuellen Methode Fressen (sie ist individuell, weil sie nur das Gewicht des Elefanten erhöht zu dem sie gehört). Es kann also beliebig viele Elefanten geben, aber sie folgen alle einem gemeinsamen Bauplan. Das gleiche gilt für Bankkonten: wenn man einmal eine Klasse definiert hat, die alle wesentlichen Eigenschaften und Methoden umfasst, die man zum Umgang mit einem Bankkonto benötigt, dann kann man sie verwenden um beliebig viele Bankkonten (als Objekte) zu erzeugen. Das Schöne ist: diese Klasse kann jede/r in einem Bankprogramm einsetzen und braucht sich nicht darum zu kümmern, wie sie im Detail programmiert ist (zur Definition einer Klasse mit Hilfe einer Programmiersprache muss man natürlich programmieren). Es genügt wenn man die Eigenschaften kennt (z.b. wäre der aktuelle Kontenstand eine Eigenschaft, eine andere ist der Zinssatz für Guthaben) und die verfügbaren Methoden. Ein Beispiel für eine Methode: Auszahlung. Vermindert die Eigenschaft Kontenstand um einen eingegebenen Betrag, eventuell wird auch noch der Kreditrahmen gecheckt und festgestellt, ob die Auszahlung überhaupt erfolgen darf. Prof. Martin Trauth Folie 3 / 25

1.3 Die Programmiersprache Java Java, eine von der Firma SUN maßgebend entwickelte und vertriebene Programmiersprache, ist erst seit 1996 auf dem Markt, also noch vergleichsweise jung. Ihr großer Markterfolg beruht sicher auf der Tatsache dass das Java Entwicklungssystem (JDK = Java Development Kit) kostenfrei vertrieben wurde, aber auch auf einer Reihe von Vorzügen dieser Programmiersprache: Weitgehende Unabhängigkeit von Hardwareplatform und Betriebssystem. Sehr konsequente Umsetzung des objektorientierten Programmierkonzepts, dennoch relativ einfach strukturierte Sprache Schutzmechanismen gegen Programmierfehler ( sicherer als C) Viele Programmkomponenten haben die gleiche Syntax wie die bekannte Programmiersprache C Gut geeignet für Web-Anwendungen, da von Beginn an dafür entwickelt Weitere OOP-Programmiersprachen: C++, C#, Visual Basic, Smalltalk, u.v.m. Fast alle neueren Programmiersprachen (auch grafische Programmierung) basieren auf OOP. Prof. Martin Trauth Folie 4 / 25

1.4 Die Plattformunabhängigkeit von Java Übliche Compiler-Sprachen, wie C, übersetzen den Quelltext in Maschinencode. Dieser Maschinencode ist natürlich nur auf einer bestimmten CPU lauffähig, d.h. er muss eigens dafür kompiliert werden. Außerdem sind die Gegebenheiten des Betriebssystems zu beachten, unter dem das Programm laufen soll. Java arbeitet mit einer so genannten Virtual Machine (VM). Das ist ein Programm, das eine CPU und (weitgehend) ein Betriebssystem simuliert. Natürlich ist die VM für ein bestimmtes Betriebssystem und eine bestimmte CPU compiliert. Aber wenn man sie einmal hat, dann kann man damit alle Java-Programme laufen lassen. Java-VMs werden von SUN für alle gängigen Betriebssysteme kostenfrei zu Verfügung gestellt. In vielen Fällen werden sie von Java-Anwendungen automatisch aus dem Internet heruntergeladen. Der Ablauf einer Java-Programmerstellung: Editor erstellt Programmtext (Endung.java) Compiler erzeugt ByteCode (Endung.class) Java-VM interpretiert Byte-Code (Ablauf auf CPU) Ein Linker wird für Java nicht benötigt. Prof. Martin Trauth Folie 5 / 25

1.5 Vergleich von Java und C Identisch bzw sehr ähnlich sind: Variablendeklaration (aber einige Datentypen sind anders) Zuweisungen Kontrollanweisungen wie if...else, for-, while- und do while-schleifen (sowie break- und continue-anweisung) Funktionsaufrufe (wobei man in Java von Methoden spricht) Kommentarzeichen (// oder /* */) Einfache mathematische Operatoren (+, -, *, /, %) Verschiedenheiten: Typische OOP-Strukturen, z.b. Klassen (diese ähneln aber z.t. C++) Java verwendet keine expliziten Pointervariablen Handhabung von Datenfeldern und Zeichenketten ist anders Keine Präprozessordirektiven und Headerdateien bei Java Java verwendet packages als Programm sammlungen z.t. andere Datentypen (boolean) Keine Strukturen (nicht nötig, da mit Klassen gearbeitet wird) Prof. Martin Trauth Folie 6 / 25

1.6 Primitive Datentypen Die wichtigsten sog. primitiven (vordefinierten) Datentypen: char 2 Byte wird vor allem für Zeichen verwendet (Unicode-Codierung!) byte 1 Byte Ganzzahlen zwischen 128 und 127 int 4 Byte (immer!) Ganzzahl (auch negativ) long 8 Byte (immer!) Ganzzahl (auch negativ) mit größerem Wertebereich float 4 Byte Fließkommazahl double 8 Byte präzise Fließkommazahl boolean 1 Byte Datentyp für logische Werte (kann nur die Werte true oder false haben) Unterschiede zu C: Es gibt keine Modifikatoren, mit denen man Ganzzahltypen auf den positiven Wertebereich beschränken kann. In Java kann man stets auch negative Zahlen in long- oder int-variablen speichern. Sehr wesentlich ist der Typ boolean: Diesen Typ haben in Java alle Logikausdrücke, denn ihr Ergebnis kann immer nur true (wahr) oder false (falsch) sein. Auch Variable (des Typs boolean) können diese Werte annehmen. Wo Logikausdrücke verwendet werden (z.b. in if-anweisungen) können daher in Java keine Ganzzahl-Werte eingesetzt werden. Unicode ist ein Code für Zeichen. Statt 128 Zeichen, wie mit ASCII- und ANSI-Codierung können in Unicode 65536 Zeichen dargestellt werden. Die ersten 64 Zeichen entsprechen aber der ASCII-Tabelle. Prof. Martin Trauth Folie 7 / 25

1.7 Syntax von Klassen Klassen sind die grundlegenden Strukturen des Programmierens in Java (und auch anderen OOP-Sprachen). Ihr grundsätzlicher Aufbau wird an einem Beispiel erläutert. Die Klasse heißt Auto. public class Auto { public String name; public int leistung; public int lebensalter; Die Grundstruktur der Klasse ähnelt sehr einer Strukturdefinition. Tatsächlich gibt es viele Gemeinsamkeiten zu Strukturen, aber Klassen können neben Variablen auch noch Methoden enthalten. Einige Hinweise zur üblichen Schreibweise: Klassennamen werden groß geschrieben (hier: Auto), während Variablennamen (Eigenschaftsnamen) klein geschrieben werden. String ist ebenfalls eine Klasse (kein integraler Datentyp), die Zeichenketten-Objekte generieren kann (siehe nachfolgendes Kapitel). Die sonstige Schreibweise von Namen ist im Wesentlichen wie bei C. Die Variablen name, leistung und lebensalter sind die Klasseneigenschaften und werden beim Erzeugen von Objekten zu Objekteigenschaften. Das Schlüsselwort public definiert den Zugriffsmodus: fremde Objekte können auf die Eigenschaften eines Objekts der Klasse Auto zugreifen (d.h. sie lesen und verändern). Prof. Martin Trauth Folie 8 / 25

1.8 Methoden Die Klasse Auto enthält bisher nur Eigenschaften. Es können auch Methoden definiert werden. Als Beispiel wird eine Methode tuneup() gezeigt, welche die Leistung erhöht (mit Parameter), sowie eine Methode getleistung(), welche die Leistung als Rückgabewert hat (Parameter- und Rückgabewerte werden wie in C gehandhabt). public class Auto { public String name; public int leistung; public int lebensalter; pow ist Parameter der Methode tuneup. Es ist keine Eigenschaft des aus der Klasse Auto abgeleiteten Objekts. public void tuneup(int pow) { this.leistung = this.leistung + pow; public int get_leistung() { return this.leistung; Das Schlüsselwort this in this.leistung bedeutet, dass die Eigenschaft leistung zum gleichen Objekt gehört wie die Methode tuneup(). Man kann es auch weglassen, aber es macht größere Programme übersichtlicher. getleistung() hat einen Rückgabewert, aber keinen Parameter. Man kann natürlich auch Methoden programmieren die sowohl Rückgabewert als auch (einen oder mehrere) Parameter besitzen. Prof. Martin Trauth Folie 9 / 25

1.9 Erzeugung von Objekten Ein Objekt der Klasse Auto könnte z.b. ein ganz bestimmtes Auto sein. Nennen wir das zu erzeugende Objekt daher autost328. Auto autost328; Diese Zeile deklariert autost328 als Referenz auf die Klasse Auto. Mit anderen Worten: autost328 ist ein Auto. Aber es ist noch kein bestimmtes Auto erzeugt worden. Es gibt noch kein Objekt. autost328 = new Auto(); Nun wird das Objekt autost328 erzeugt. Das geschieht mit den Schlüsselwort new. Die Klammern hinter Auto weisen auf eine Methode hin. Tatsächlich wird eine spezielle Methode ausgeführt: der Konstruktor (siehe 1.11). Man kann die beiden Zeilen in einer einzigen kombinieren: Auto autost328 = new Auto(); So schnell kommt man zu einem neuen Auto leider nur zu einem ziemlich virtuellen. Wichtig: erst wenn ein Objekt erzeugt ist, kann man auf dessen Eigenschaften und Methoden zugreifen (und auch das evtl nur wenn sie als public deklariert wurden). Es gibt auch so genannte (als static deklarierte) Klassenmethoden und Klasseneigenschaften, die ohne Erzeugung eines Objekts verwendet werden können (s. nachfolgendes Kapitel). Prof. Martin Trauth Folie 10 / 25

1.10 Zugriff auf Objekteigenschaften Will man nun auf die Objekteigenschaften zugreifen (lesen oder schreiben), dann wird dazu eine ähnliche Syntax wie bei Strukturen in C verwendet: ein Punktoperator zwischen Objektname und Eigenschaftsname. So wird z.b. die Eigenschaft lebensalter auf einen Wert gesetzt: autost328.lebensalter = 5; Und so wird sie gelesen: alter = autost328.lebensalter ; Diese Syntax gilt für Zugriff von anderen Objekten aus. Falls eine Methode auf eine Eigenschaft des gleichen Objekts zugreifen möchte kann man den reinen Eigenschaftsnamen nehmen (es sei denn es existiert eine Methodenvariable gleichen Namens) oder this. vor den Namen setzen (siehe auch 1.11). Prof. Martin Trauth Folie 11 / 25

1.11 Der Konstruktor Eine sehr wichtige Methode ist der Konstruktor. Er wird immer bei der Erzeugung eines neuen Objekts aufgerufen und trägt den Namen der Klasse (daran kann man ihn im Programmtext erkennen). Seine Parameter werden beim Erzeugen eines Objekts übergeben. Falls kein Konstruktor definiert ist, setzt Java bei der Objekterzeugung einen Standard- Konstruktor ein (der keine Parameter hat!). Bei unserer Auto-Klasse wäre es z.b. vorteilhaft, wenn die Objekteigenschaft Leistung bereits bei der Erzeugung des Objekts einen Wert bekommt. Das tut dieser Konstruktor: public Auto(int leistung) { this.leistung = leistung; Hinweis: der Parameter leistung hat nichts mit der Objekteigenschaft leistung zu tun. Durch this.leistung wird ganz klar auf die Objekteigenschaft leistung zugegriffen. Hier besteht also eine Notwendigkeit das Schlüsselwort this zu verwenden. Natürlich nur dann wenn, wie in unserem Beispiel, der gleiche Name für die Objekteigenschaft wie für den Parameter verwendet wurde. Bei Namensgleichheit und ohne Verwendung von this. überdecken die Namen von Methoden-Variablen (dazu zählen auch die Parameter) die Namen der Objekteigenschaften. Die Erzeugung eines Objekts sieht dann so aus: Auto meinauto = new Auto(100); Das so generierte Objekt meinauto der Klasse Auto hat nun den Wert 100 (kw) für die Eigenschaft leistung. Prof. Martin Trauth Folie 12 / 25

1.12 Kapselung In der Klasse Auto wurde eine Methode get_leistung() definiert, mit der man die Eigenschaft leistung auslesen kann. Man könnte sich fragen wozu, denn mit einem Zugriff per Punktoperator (siehe 1.10) kann die Eigenschaft doch gelesen werden. Das ist aber nur der Fall, weil die Eigenschaft durch den Modifikator public für Zugriffe fremder Objekte freigegeben ist. Das ist jedoch schlechter OOP-Stil und wurde hier nur zu Demonstrationszwecken verwendet. Eigentlich sollten Eigenschaften durch den Modifikator private nur für Zugriff des eigenen Objekts freigegeben sein. Wollen externe Objekte zugreifen, dann müssen sie das per Objektmethode tun. Diese ist dann natürlich public. Das hat den Vorteil, dass man den Zugriff auf Objekteigenschaften kontrollieren kann. Mit get_leistung kann man z.b. den Leistungswert nur lesen, nicht verändern. Die Objekteigenschaften sind gekapselt: OOP-Prinzip der Kapselung. Zugriffs-Modifikatoren für Eigenschaften und Methoden: Standard (kein Modifikator angegeben) Zugriff durch Objekte oder Klassen im gleichen package * private Zugriff nur vom gleichen Objekt bzw. der gleichen Klasse protected Zugriff durch Objekte und Klasse der gleichen oder einer abgeleiteten Klasse (s. 1.14), oder aus dem gleichen package * heraus. public Zugriff durch alle Objekte oder Klassen * package: Ordnungsstruktur in Java, wird später erläutert Prof. Martin Trauth Folie 13 / 25

1.13 Kapselung Beispiel-Schema Objekt der Klasse Auto private: Eigenschaft leistung Zugriff public: Methode get_leistung() Aufruf Rückgabewert anderes Objekt Aufruf: get_leistung() Prof. Martin Trauth Folie 14 / 25

1.14 abgeleitete Klassen (Kindklassen), Vererbung Am eingangs erwähnten Beispiel eines Objekts aus der Natur, dem Elefanten, kann man gut ein wichtiges Verfahren der OOP erläutern: die Vererbung. Nehmen wir an, es gäbe bereits eine Klasse Tier mit dazu passenden Methoden und Eigenschaften. Dann müßte man für die Klasse Elefant nicht alles neu erfinden. Der Elefant ist ja zweifellos ein Tier, also sind alle in der Tier-Klasse definierten Eigenschaften (z.b. Gewicht) und Methoden (z.b. Fressen) auch auf ihn anwendbar. Aber der Elefant hat eventuell zusätzliche Eigenschaften, z.b. eine Rüssellänge. Oder zusätzliche Methoden, z.b. das Trompeten. Umgesetzt auf OOP und Java kann man abgeleitete Klassen bilden (Kindklassen), welche die Eigenschaften und Methoden ihrer Superklasse (Elternklasse) erben. Das ist das wichtige OOP-Prinzip der Vererbung. Zusätzlich können Sie in Kindklassen weitere Eigenschaften und/oder Methoden definieren. Das geschieht durch Verwendung des Schlüsselworts extends (erweitert), woraus bereits hervorgeht, dass eine Kindklasse eine Erweiterung bzw. Spezialisierung der Elternklasse darstellt. Ein reines Kopieren wäre auch ziemlich sinnlos, denn aus einer Klasse lassen sich ohnehin beliebig viele Objekte erzeugen. Aus unserer Beispielklasse Auto lässt sich die Kindklasse Transporter ableiten. class Transporter extends Auto { private int maxzuladung; Es wurde die zusätzliche Eigenschaft maxzuladung definiert. Ebenso ist es möglich zusätzliche Methoden zu definieren. Hinweis: Konstruktoren werden nicht vererbt und müssen im Bedarfsfall neu definiert werden. Prof. Martin Trauth Folie 15 / 25

1.15 Kindklassen Überschreiben von Methoden Nicht nur neue Methoden kann man in einer Kindklasse definieren, sondern auch vorhandene überschreiben. Hinweis: das Überschreiben von Methoden ist etwas anderes als das Überladen, das später erklärt wird. Am Beispiel der Klasse Transporter: die Methode set_zuladung() wird hinzu gefügt, die ererbte Methode tuneup() überschrieben. class Transporter extends Auto { private int maxzuladung; public void set_zuladung(int gewicht) { this.maxzuladung = gewicht; public void tuneup(int pow) { if (pow > 1000) pow = 1000; // Limitierung auf 1000 kw this.leistung = pow; Der Programmtext der Elternklasse muss natürlich irgendwo im gesamten Programmcode enthalten sein (wenn sie nicht durch package-import geladen wird). Es spielt aber keine Rolle, ob ihr Programmtext vor oder hinter der Kindklasse steht. Das Überschreiben von Methoden ist ein sehr häufiges Verfahren wenn man fertige Klassen aus Klassenbibliotheken übernimmt. Man leitet eine Kindklasse ab und kann in dieser durch Überschreiben Änderungen vornehmen. Prof. Martin Trauth Folie 16 / 25

1.16 Die Methode main(), Klasseneigenschaften und Methoden Die bisherigen Beispiele starten unter normalen Betriebssystemen nicht. Dazu wird, wie in C, eine Hauptfunktion main() benötigt. In Java wird Methode statt Funktion gesagt. Java verlangt die komplette Parameterliste für main(). Leere Klammern werden von vielen Compilern als Fehler bewertet, auch wenn man die Kommandozeilen-Parameter selten benötigt. Ein einfaches Beispiel für main(): class MeinTest1 { public static void main(string[] args) { System.out.println("Berechne 7 * 2:" + 7 * 2); Siehe 1.17 In Java baut alles auf Klassen auf. Also befindet sich auch die Methode main() in einer Klasse, der man normalerweise den Namen des Programms gibt. Man fügt dann weitere Klassen an, mit denen man die gewünschten Objekte erzeugen kann. Die Methode main() ist aber keine Objektmethode, da sie mit dem Modifikator static deklariert wurde. Sie ist eine so genannte Klassenmethode. Man kann sie mit der Syntax <Klassenname>.main() aufrufen (das tut aber in der Regel das Betriebssystem oder das Entwicklungssystem). Mit dem Modifikator static können auch Klasseneigenschaften deklariert werden. Klasseneigenschaften und methoden werden bei der Erzeugung von Objekten nicht zu Objekteigenschaften oder Objektmethoden. Würde man ein Objekt der Klasse MeinTest1 erzeugen, so hätte es weder Eigenschaften noch Methoden. Man verwendet Klasseneigenschaften und methoden, wenn man sie nur einmal benötigt und nicht in viele Objekte kopieren möchte. Prof. Martin Trauth Folie 17 / 25

1.17 Die Standard-Ausgabe Die Standard-Ausgabe-Methoden lauten System.out.println() und System.out.print(). System.out ist das Objekt dazu. Es ist ein automatisch (von der Java-VM) erzeugtes Objekt, deswegen auch die ungewöhnliche Syntax mit dem Klassennamen System im Objektnamen. println() gibt immer eine neue Zeile aus. print() fügt die Ausgabe dort an, wo die letzte Ausgabe endete. Als Parameter werden Zeichenketten und/oder Ausdrücke verwendet, die durch +Zeichen verbunden werden. Platzhalter für die Ausdrücke werden nicht benötigt. Alle aus C bekannten Steuerzeichen (z.b. \n) können verwendet werden. Die Ausgabe des Beispiels System.out.println("Berechne 7 * 2:" + 7 * 2); ist: Berechne 7 * 2: 14 Prof. Martin Trauth Folie 18 / 25

1.18 Beispiel eines Java-Programms I Für unser Beispiel benötigen wir die vollständige Beispiel-Klasse Auto. Sie ist daher hier aufgeführt: public class Auto { private String name; private int leistung; private int lebensalter; public Auto(int leistung) { this.leistung = leistung; public void tuneup(int pow) { this.leistung = this.leistung + pow; public int get_leistung() { return this.leistung; Prof. Martin Trauth Folie 19 / 25

1.19 Beispiel eines Java-Programms II Die main-methode in der Klasse MeinTest2 erzeugt ein Objekt der Klasse Auto und arbeitet mit dessen Methoden. class MeinTest2 { public static void main(string[] args) { Auto meinauto = new Auto(75); System.out.println("Leistung: " + meinauto.get_leistung() + "kw"); meinauto.tuneup(50); System.out.println("getunte Leistung: " + meinauto.get_leistung() + "kw"); Die Ausgabezeilen dieses Programms sehen so aus: Leistung: 75kW getunte Leistung: 125kW Objekt wird erzeugt! Man kann problemlos in neuer Zeile weiter schreiben. Prof. Martin Trauth Folie 20 / 25

1.20 Logikoperationen und der Typ boolean Logikausdrücke haben in Java das Ergebnis true oder false. Will man diese Werte speichern, benötigt man eine Variable vom Typ boolean. Wenn man die Werte ausgeben läßt, werden sie als true oder false dargestellt. Ein Beispiel: class MeinTest3 { public static void main(string[] args) { int a = 5, b = 10; boolean bool1; System.out.println("a < b: " + (a < b)); System.out.println("a == b: " + (a == b)); bool1 = a >= b; System.out.println("a >= b: " + bool1); Die Ausgabezeilen dieses Programms: a < b: true a == b: false a >= b: false Prof. Martin Trauth Folie 21 / 25

1.21 Pseudokonstanten, Schlüsselwort final Wenn man in Java eine Variable unveränderbar machen möchte, sie also als Konstante benutzt, dann verwendet man das Schlüsselwort final in ihrer Deklaration. Sie kann dann nur einmal einen Wert zugewiesen bekommen. Jede folgende Wertzuweisung würde einen Compilerfehler auslösen. Man spricht von konstanten Variablen oder Pseudokonstanten. Beispiel: final double UST_SATZ = 19. ; final char EURO; EURO = ; Deklaration und Wertzuweisung in einer Zeile. Deklaration und Wertzuweisung getrennt. Konstantennamen werden wie in C üblicherweise mit Großbuchstaben geschrieben (final funktioniert genau so wie const in C). Auch die Schreibweise einzelner Zeichen in einfachen Hochkommata entspricht der C-Schreibweise. Prof. Martin Trauth Folie 22 / 25

1.22 Klassenpakete (packages) verwenden Klassenpakete (packages) sind Sammlungen von Klassen. Ihre Hauptbedeutung haben sie als Bestandteile von Klassenbibliotheken. Die Packages sind so etwas wie die Bücher in der Java-Bibliothek. Sie fassen Klassen zusammen, die zu einem Thema gehören. Paketnamen werden klein geschrieben und können aus mehreren Namensbestandteilen zusammengesetzt sein, die durch Punkte getrennt werden. Beispiele: java.lang java.math java.awt.event grundlegende Klassen von Java Mathematik-Klassen Ereignisbehandlung Will man eine oder mehrere Klassen aus einem solchen Paket verwenden, dann muss man es importieren. Dazu schreibt man das Schlüsselwort import vor <paketname>.<klassenname> oder <paketname>.* (dann werden alle Klassen des Pakets importiert). Wichtig: die import-anweisung muss vor nachfolgenden Klassendefinitionen stehen, die Klassen des Pakets verwenden. Das paket java.lang wird automatisch verwendet, das muss man nicht explizit importieren. import java.awt.event.*; // alle Klassen des Pakets werden importiert import java.applet.applet; // nur die Klasse Applet wird importiert public class MeineKlasse { /* Code der Klasse */ Eine Klasse im importierten Paket muss als public definiert sein, sonst kann sie von einer anderen Klasse nur dann verwendet werden wenn diese dem gleichen Paket angehört. Prof. Martin Trauth Folie 23 / 25

1.23 Packages erstellen Man kann auch eigene Packages erstellen. Dazu wird im Quelltext vor allen Importanweisungen das Schlüsselwort package, gefolgt vom gewünschten Paketnamen geschrieben. Beispiel: package mypackage.first; import java.awt.*; public class MeineKlasse1 { /* Code der Klasse */ Der Programmcode wird dann im Unterordner mypackage\first des aktuellen Arbeitsverzeichnisses gespeichert. Dieses Unterverzeichnis muss man selbst erstellen, es sei denn das Java-Entwicklungssystem sorgt dafür. Importiert ein anderes Programm dieses Paket, dann wird es dort gesucht. Liegt dieses importierende Programm aber in einem anderen Arbeitsverzeichnis, dann muss man dem Compiler durch Angabe eines classpath das Package-Verzeichnis mitgeteilen (das Thema soll aber hier nicht weiter vertieft werden. Bei Interesse bitte Fachliteratur lesen). Es können auch bereits compilierte Java-Klassen (Bytecode, Extension.class) im Paketverzeichnis gespeichert werden. Wenn sie importiert werden, muss der Compiler nicht mehr übersetzen. Packages mit dem ersten Teil java oder javax liegen in einem speziellen Bibliotheksverzeichnis, das dem Compiler und der VM bekannt ist. In dem Fall braucht man sich nicht um den Suchpfad zu kümmern. Diese Bibliotheks-Packages sind immer compiliert und zusätzlich in Archiv-Dateien komprimiert (Extension.jar). Prof. Martin Trauth Folie 24 / 25

1.24 Bemerkungen zur Wortwahl In der Literatur werden die gleichen Sachverhalte in Java leider verschieden bezeichnet. Statt von Objekten wird z.t. von Instanzen (einer Klasse) geschrieben. Eigenschaften werden manchmal (Objekt-) Variable genannt. Außerdem gibt es alle möglichen Kombinationen dieser Bezeichnungen, z.b. Instanzvariable was das gleiche ist wie eine Objekteigenschaft. Spezialisten unterscheiden zwischen Instanzen und Objekten. Die Bedeutungen sind etwas verschieden jedenfalls für Spezialisten. Für die meisten Fälle (und auch in diesem Skript) sind solche Details nicht wichtig. Schon deshalb weil sich die Spezialisten ohnehin nie einig sind... Einig ist man sich (weitgehend) darin, dass man von Methoden statt von Funktionen spricht und schreibt. Variablen und Eigenschaften sind aber durchaus verschieden. Eine Variable ist alles was einen Wert speichern kann. Daher sind in OOP alle Eigenschaften Variable. Aber umgekehrt beschreibt nicht jede Variable eine Eigenschaft. Auch Methoden können interne Variable benutzen. Diese werden aber nicht zu Objekt- oder Klasseneigenschaften. Prof. Martin Trauth Folie 25 / 25