Grundlagen der Informatik Einführung in die objektorientierte Software-Entwicklung mit JAVA Teil 1 Prof. Dr. rer. nat. Katrin Brabender (Skript) Prof. Dr.-Ing. Reiner Dudziak (Vorlesung) Dipl.-Ing. Torsten Richta (Vorlesung) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 1 Labor für Informatik – Ansprechpartner Dozent: Prof. Dr.-Ing. Reiner Dudziak Raum: C4 – 04 Telefon: +49 (0) 234 / 32 – 10 423 eMail: [email protected] Sprechzeiten: dienstags, 12h – 13h Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 2 Labor für Informatik – Ansprechpartner Dozent: Dipl.-Ing. Torsten Richta Raum: C6 – 06 Telefon: +49 (0) 234 / 32 – 10 375 eMail: [email protected] Sprechzeiten: immer dann, wenn Zeit da ist; kommen Sie einfach vorbei oder schreiben Sie eine eMail Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 3 Labor für Informatik – Ansprechpartner Mitarbeiter: Dipl.-Ing. Dirk Mohr Raum: C2 – 05 Telefon: +49 (0) 234 / 32 – 10 454 eMail: [email protected] Sprechzeiten: immer dann, wenn Zeit da ist; kommen Sie einfach vorbei oder schreiben Sie eine eMail Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 4 Labor für Informatik – Ansprechpartner Mitarbeiter: Dipl.-Ing. (FH) Jörg Henrich Raum: C2 – 05 Telefon: +49 (0) 234 / 32 – 10 454 eMail: [email protected] Sprechzeiten: donnerstags (und immer dann, wenn Zeit da ist; kommen Sie einfach vorbei oder schreiben Sie eine eMail) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 5 Labor für Informatik – Institutsseite auf der Homepage der Hochschule Bochum Die Institutsseite des Labors für Informatik auf der Homepage p g der Hochschule Bochum finden Sie wie folgt: http://www.hochschule-bochum.de > Fachbereich Mechatronik und Maschinenbau > Einrichtungen Institute > (Institut für) Automatisierung > Lehre > Informatik (IN)/Grundlagen der Informatik (GIN) Hi finden Hier fi d Sie Si Übungsaufgaben Üb f b undd Informationen I f ti zur Vorlesung V l sowie i Informationen zum Praktikum, Literaturhinweise und nützliche Links. Aktuelle Informationen stellen wir außerdem auf die Pinnwand im meine_BOBereich auf der Homepage der Hochschule Bochum. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 6 Hinweis zu den Übungsaufgaben Musterlösungen zu den auf der Homepage der Hochschule Bochum auf den Seiten des Labors für Informatik zum Download angebotenen Übungsaufgaben, die möglicherweise an der Hochschule Bochum im Umlauf sind, sind weder von uns herausgegeben noch auf ihre Richtigkeit überprüft und "abgesegnet" worden. Wir empfehlen Ihnen, die Aufgaben selbstständig - alleine oder in Lerngruppen - zu lösen, und bieten Ihnen gerne die Möglichkeit an, uns bei Problemen anzusprechen. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 7 Labor für Informatik – Informationen zur Vorlesung GIN Ergänzende g Informationen (Beispielprogramme, p p g , Übungsaufgaben, g g , zusätzliche Folien, ...) zu den einzelnen Vorlesungen werden nur nach Anforderung versendet: Dies geschieht durch eine eMail mit dem Betreff VorlesungGINxxxx an [email protected]. Hierbei steht xxxx für eine Kombination aus Z hl undd Buchstaben, Zahlen B h t b die di Ihnen Ih i der in d entsprechenden t h d Vorlesung V l mitgeteilt it t ilt wird. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 8 Labor für Informatik – Informationen (Spielregeln) zum Praktikum GIN • Wer an einem Termin nicht teilnehmen kann,, muss sich spätestens p eine Woche vor dem Termin abmelden und sich um einen Ausweichtermin (s. nächste Seite) kümmern. • Bei Krankheit ist es zwingend erforderlich, sich um einen Ausweichtermin zu kümmern und ein ärztliches Attest vorzulegen. • Das Praktikum ist am vorgesehenen Termin zu absolvieren. Wird das Praktikum ohne Absprache zu einem anderen Termin besucht, wird kein Testat erteilt. • Es muss immer der vorherige Versuch testiert sein, bevor ein neuer Versuch zum Testat vorgelegt werden kann. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 9 Vorgehensweise im Praktikum IN Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 10 Termine für das Praktikum IN (WiSe 2011/2012) Gruppe pp BMB1 (donnerstags): g 27.10.,, 17.11.,, 01.12.,, 15.12.,, 12.01. Gruppe BMB2 (donnerstags): 10.11., 24.11., 08.12., 22.12., 19.01. Gruppe BMB3 (dienstags): 25.10., 15.11., 29.11., 13.12., 10.01. Gruppe BMB4 (dienstags): 08.11., 22.11., 06.12., 20.12., 17.01. BWIM (1. Semester): donnerstags (parallel zu BMB1 oder BMB 2) Die Gruppeneinteilung finden Sie auf der Institutsseite auf der Homepage der Hochschule Bochum. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 11 Themen des 1. Semesters 1. Grundbegriffe aus der Informatik 2. Zahlendarstellung und mathematische Grundoperationen in einem Rechnersystem 3. Grundlagen der Booleschen Algebra 4. Softwareentwicklung mit JAVA • Datentypen • Kontrollstrukturen • Methoden • Grundlagen der Objektorientierung (Klassen, Vererbung, Kapselung etc.) • Ausnahmebehandlung • Die Klassen Object, String, StringBuffer Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 12 1. Grundbegriffe aus der Informatik Aufbau eines Rechnersystems Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 13 Der Universalrechenautomat nach von Neumann Der logische Aufbau moderner Computer folgt dem Konzept des Mathematikers John von Neumann (1903-1957) und wurde in den Jahren 1946/47 in den USA entwickelt. Der von Neumann Rechner besteht im Wesentlichen aus den drei Einheiten - Speicherwerk (Arbeitsspeicher) Hier werden die Programme und Daten gespeichert - Rechenwerk Hier werden die Rechenoperationen und logischen Verknüpfungen ausgeführt - Steuerwerk Hier werden der Programmablauf sowie die Ein- und Ausgabe von Programmen und Daten gesteuert Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 14 Grundlegende Eigenschaften des von Neumann Rechners • Struktur ist unabhängig von den zu bearbeitenden Problemen • Programme, g , Befehle und Daten befinden sich im selben Speicherwerk p • Der Speicher wird in einzelne Speicherplätze unterteilt, die eine eindeutige Adresse haben. => Informationen können eindeutig angesprochen werden • Das Duale Zahlensystem wird verwendet • Sequentielles Abarbeiten von Befehlen Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 15 Die Zentraleinheit eines Computers Steuerwerk Hauptp speicher CPU Rechenwerk R h k Zentraleinheit Komponenten der Zentraleinheit sind - Steuerwerk (control unit) - Rechenwerk - Hauptspeicher CPU (Central Processing Unit) Der Informationsaustausch erfolgt über zwei Bussysteme. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 16 Die CPU (Central Processing Unit) Die CPU besteht aus dem Steuerwerk und Rechenwerk. Si iistt d Sie das K Kernstück tü k eines i C Computers. t Die CPU dient zur Verarbeitung von Daten, die sich im Speicher des Rechners befinden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 17 Das Steuerwerk mit Befehlsregister, Befehlszähler, Adressregister • steuert den Austausch von Daten mit dem Arbeitsspeicher • steuert den Datenaustausch mit den Peripheriegeräten, wie Festplatte, Drucker etc. • steuert die Ausführung der Maschinenbefehle Register sind extrem schnelle Hilfsspeicherzellen mit denen die CPU die logischen Operationen ausführen kann. Diese liegen nicht im Arbeitsspeicher sondern d di direkt kt iinnerhalb h lb d der CPU und d kö können d deshalb h lb vom R Rechenwerk h k di direkt kt erreicht werden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 18 Die wesentlichen Aufgaben des Steuerwerks sind Der durchzuführende Befehl steht im Befehlsregister. Die Adressen der benötigten g Daten stehen im Adressregister. g Die Adresse des nächsten Befehls steht im Register Befehlszähler. 1. Befehlsdecodierung: Erkennen eines Programmbefehls und Einleiten der zu seiner Ausführung notwendigen Funktionen. 2. Ablaufsteuerung: Steuern der Reihenfolge der auszuführenden Programmbefehle. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 19 Typische Befehle sind LOAD Laden eines CPU Registers mit einem Wert aus dem Speicher STORE Speichern eines Registerinhaltes in einem Speicherplatz des Speichers ADD, SUB, MUL, DIV Arithmetische Operationen auf Registern NOT, OR, AND, XOR Logische Befehle auf Registern COMPARE Vergleich des Inhalts zweier Register IN OUT Ei IN, Ein- und dA Ausgabe b von D Daten t an R Register i t d der P Periperiegeräte i i ät Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 20 Jeder dieser Befehle besitzt einen OpCode (Befehlsnummer). Ein Programm besteht aus einer Folge von OpCodes. Wird ein Programm ausgeführt, so wird die Programmdatei in den Speicher geladen. Die CPU übernimmt die Kontrolle und führt die den Opcodes entsprechenden Befehle aus. Ein internes Register, der Befehlszähler, zeigt immer auf den nächsten auszuführenden Opcode. Die CPU durchläuft dabei immer wieder den folgenden Zyklus LOAD (Lade den Opcode, auf den der Befehlszähler zeigt) INCREMENT (Erhöhe den Befehlszähler) EXECUTE (Führe den Befehl, der zu dem Opcode gehört, aus) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 21 3. Koordination Koordination sämtlicher Transporte auf den verschiedenen Bussystemen. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 22 Das Rechenwerk Besteht im Wesentlichen aus der ALU (Arithmetical Logical Unit). Hier werden alle arithmetischen und logischen Operationen ausgeführt, indem zwei Datenregister g miteinander logisch g verknüpft p werden. Von der Breite des Datenregisters leitet man die Bezeichnung des Prozessors ab, z. B. ein 16 Bit Prozessor hat Datenregisterbreite von 16 Bit. Beispiele: 8 Bit Prozessor: Intel 8086 (XT), 8051 16 Bit Prozessor: Intel 80286 (AT) 32 Bit Prozessor: Intel 80386, Motorola 68000 64 Bit Prozessor: Intel Itanium, AMD Athlon 64 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 23 Der Hauptspeicher Wird als RAM (Random Access Memory) bezeichnet. Er ist ein außerhalb der CPU befindlicher Speicher p für Daten und Programme. g Die Bits des Hauptspeichers sind byte- oder wortweise organisiert. Jeder Befehl kann in Abhängigkeit von der Struktur des Prozessors auf ein oder mehrere Byte zugreifen, um sie zu lesen, zu bearbeiten oder zu schreiben. Jedes Byte des Speichers erhält eine Adresse. Auf jedes Byte kann direkt zugegriffen werden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 24 Ein dynamischer Speicher ist der Cache Zusätzlicher Speicher zwischen dem Hautspeicher und den Registern der Zentraleinheit, auf den besonders schnell zugegriffen werden kann. Im Normalfall bildet der Cache zusammen mit dem Prozessor ein Bauteil. Kleinere Programmstrukturen, die sich komplett im Cache befinden, können so aus diesem deutlich schneller abgearbeitet werden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 25 Das BUS System Unterschieden wird zwischen internem und externem Bussystem. Das interne Bussystem sorgt für den Datenaustausch innerhalb der CPU. Das externe Bussystem (Systembus) sorgt für den Datenaustausch zwischen CPU und Hauptspeicher sowie CPU und Peripheriegeräte. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 26 Das externe Bussystem bzw. der Systembus besteht aus Adressbus, Datenbus und Steuerbus. • Adressbus selektiert die Komponenten • Datenbus übermittelt die Daten • Steuerbus übernimmt Verwaltungsfunktion z. B. Umschalten von Lesen auf Schreiben Adressen / Adressbus Steuerwerk Befehle / Datenbus Rechenwerk Hauptspeicher Daten / Datenbus Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 27 Die Bestandteile eines Rechnersystems • Eingabeeinheit • Verarbeitungseinheit • Ausgabeeinheit Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 28 Peripherie Die Gesamtheit der Eingabegeräte, Speichergeräte, Dialoggeräte und Ausgabegeräte , d. h. alle Geräte außerhalb der Zentraleinheit bezeichnet man als Peripherie Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 29 Dateneingabe-Geräte • • • • Tastatur Maus Touchpad Scanner etc. Dateiausgabe-Geräte • • Bildschirm Drucker etc. Schnittstellen • • Netzwerk Seriell, Parallel, USB Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 30 Massenspeicher / Festplatte Speichern von großen Datenmengen Köpfe, Zylinder, Sektoren, Spuren Spur Sektor Spur 1023 Spur 0 Zylinder Kopf Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 31 Organisation von Massenspeicher Die Verwaltung der physikalischen Eigenschaften einer Platte wird durch BIOS und Betriebssystem vollständig gekapselt. Für den Benutzer erfolgt die Organisation von Festplatten in Verzeichnissen. Die Organisation von Dateien erfolgt in Abhängigkeit vom Betriebssystem in • Laufwerke (DOS/Windows) • Verzeichnisse • Unterverzeichnisse Zum Einrichten von Verzeichnisstrukturen muß berücksichtigt werden • Benutzerrechte, Benutzerrechte Zugriffsrechte • Sicherungskonzepte • Backup-Strategien Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 32 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 33 Software in einem Rechnersystem Unter Software versteht man alle Programme, Prozeduren und Objekte, die ein Rechnersystem lauffähig machen. Unterschieden wird zwischen Systemsoftware und Anwendungssoftware. Zur Systemsoftware zählen alle Programme, die für den korrekten Ablauf von Rechnern verantwortlich sind, wie BIOS und Betriebssystem. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 34 BIOS Das BIOS – Basic IO System - enthält • g grundlegende g Hilfsprogramme p g zur Ansteuerung g von Hardwarekomponenten (z. B. Tastatur, Maus, Festplatte) • Programme, die nach Einschalten des Rechners ausgeführt werden, wie • Prüfung, welche Geräte angeschlossen sind, • Funktionstest des Speichers • Laden des Betriebssystems • Ist das BIOS in einem nicht flüchtigem Speicher (ROM oder EPROM) fest im Gerät eingebaut, so spricht man auch von Firmware. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 35 Das Betriebssystem Verwaltet die Ressourcen des Rechners und stellt Dienstleistungen zur Verfügung. Die zentralen Aufgaben des Betriebssystems sind • Ablaufsteuerung Laden, Starten und Abarbeiten der Anwenderprogramme • Speicherverwaltung z. B. Festlegung der vom Programm zu benutzenden Adressbereiche des Hauptspeichers • Konfigurationsverwaltung Erkennen aller angeschlossenen Peripheriegeräte Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 36 • Ein- und Ausgabesteuerung • Prozessverwaltung • Zugriff und Verwaltung des Dateisystems Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 37 Die Anwendungssoftware Anwendungsprogramme unterstützen den Anwender bei der Lösung von Problemen. Bsp: Textverarbeitungsprogramme, Tabellenkalulation etc. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 38 Zusammenfassung Ein Computersystem besteht aus den Komponenten Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 39 2. Zahlendarstellung und mathematische Grundoperationen in einem Rechnersystem • Zahlensysteme • Zahlenkonvertierung • Grundoperationen in den Zahlensystemen - Das Rechnen im Dualsystem • Subtraktion und Division mit Hilfe des Komplements • Darstellung von Ganzen- und Gleitkommazahlen im Rechner Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 40 Zahlensysteme Der Wert einer Zahl im Dezimalsystem kann dargestellt werden in der Form n x bi *10i , bi 0,1,2,3,4,5,6,7,8,9 im Bsp: 345,23 = 3*102 + 4*101 + 5*100 + 2*10-1 + 3*10-2 Diese Darstellung nennt man Stellenwertsystem. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 41 Definition Stellenwertsystem System zur Darstellung von Zahlen durch Ziffern, bei denen der Wert einer Ziffer von der Stelle abhängt, an der sie innerhalb der Zahl geschrieben ist. Für den Wert einer Zahl z in einem Stellenwertsystem zur Basis B gilt n z bi B i , bi 0,1,2, , B 1 mit B IN , B 2 i m m Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 42 Beispiel für einige Stellenwertsysteme Zahlensystem Dualsystem Fünfersystem Siebenersystem Oktalsystem Dezimalsystem Hexadezimalsystem Zahlenbasis B=2 B=5 B=7 B=8 B=10 B=16 Ziffern 01 0,1 0,1,2,3,4 0,1,2,3,4,5,6 0,1,2,3,4,5,6,7 0,1,2,3,4,5,6,7,8,9 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F Beispiel 11000011 1240 366 303 195 C3 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 43 Binärsystem Eine Menge, die nur aus zwei Zeichen besteht, z. B. Morsealpabet, Fußgängerampel etc. Das Dualsystem ist ein Spezialfall des Binärsystems. Binärsystems Für die interne Verarbeitung innerhalb eines Rechners wird das Dualsystem benutzt. Das Oktal- und Hexadezimalsystem sind ebenso wichtige Stellenwertsysteme, da sie als abkürzende Schreibweise für Dualzahlen benutzt werden können. Da 8=23 und 16=24, können jeweils 3 Dualziffern durch eine Oktalziffer und 4 Dualziffern durch eine Hexadezimalziffer ersetzt werden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 44 Besteht die Gefahr der Verwechslung, wird das benutzte Stellenwertsystem durch Zusätze markiert: Dualsystem: 100100112 Oktalsystem: 2238 Dezimalsystem: 14710 Hexadezimalsystem: 9316 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 45 Vergleichstabelle Dezimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Dual 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 Oktal 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 Hexadezimal 0 1 2 3 4 5 6 7 8 9 A B C D E F Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 46 Zahlenkonvertierung Dezimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Die Umwandlung von Dual in Oktal oder Dual in Hexadezimal und umgekehrt ist sehr einfach. Umwandlungstabellen Dezimal 0 1 2 3 4 5 6 7 Dual 000 001 010 011 100 101 110 111 Oktal 0 1 2 3 4 5 6 7 Dual 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Hexa 0 1 2 3 4 5 6 7 8 9 A B C D E F Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 47 Beispiel: 1 0 0 1 0 1 1 1 0 1, 1 0 1 0 0 1 12=X16 0 0 1 0 0 1 0 1 1 1 0 1, 1 0 1 0 0 1 1 0 2 5 D A 6 Hi Hinweis: i Die Umwandlung von Dezimalzahlen in Dual-, Oktal- oder Hexadezimalzahlen ist auf diese einfache Art nicht möglich. Hierfür gibt es Konvertierungsverfahren. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 48 Umwandlung von ganzen Zahlen im Dezimalsystem in eine Zahl beliebiger Basis Beispiel: 232010=X8 a) Z Z div 8 Z mod 8 2320 ? ? b) c) d) Z 2320 290 36 Z div 8 290 36 ? Z mod 8 0 2 ? Z 2320 290 Z div 8 290 ? Z mod 8 0 ? Z 2320 290 36 4 Z div 8 290 36 4 0 Z mod 8 0 2 4 4 Ergebnis: 232010= 44208 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 49 Umwandlung einer ganzen Zahl beliebiger Basis in eine Dezimalzahl Verfahren: Multipliziere die erste Ziffer (von links) der umzuwandelnden Zahl mit ihrer Basis B B, addiere dazu die nächste Ziffer Ziffer, multipliziere das Ergebnis erneut mit Basis B, usw. Beispiel 44208=X10 4 B=8 4 32 36 2 288 290 0 2320 2320 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 50 Grundoperationen in den Zahlensystemen - Das Rechnen im Dualsystem Unsere üblichen Rechenverfahren sind allgemein für Stellenwertsysteme gültig. Es wird sich zeigen, dass sich alle 4 Grundrechenarten im Dualsystem auf die Addition zurückführen lassen. Addition im Dualsystem + 0 1 Additionsregeln 0 0 1 1 1 10 Beispiel für eine Addition 1 0 0 1 1 12 + 1 1 0 1 12 = ? + Übertrag 1 0 1 1 1 1 0 0 0 1 1 0 1 0 1 0 1 1 1 1 1 1 0 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 51 Multiplikation im Dualsystem Multiplikationsregeln * 0 1 0 0 0 1 0 1 Verfahren: a.)) Verschiebe die zu multiplizierende p Zahl nach links b.) Addiere die Zahlen Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 52 Beispiel für eine Multiplikation 1 Übertrag 0 0 1 1 0 * 0 1 0 1 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1 0 1 0 1 0 0 1 0 0 1 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 53 Subtraktion im Dualsystem Subtraktionsregeln 0 -0 0 Leihen 0 0 -1 1 1 1 -0 1 0 1 -1 0 0 Beispiel 1 Leihen L ih Übertrag 1 0 1 1 1 0 1 0 0 1 1 0 Dieses Rechenverfahren ist für einen Computer nicht geeignet. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 54 Division im Dualsystem Das schriftliche Divisionsverfahren kann analog zum Dezimalsystem benutzt werden. Di i i Divisionsregeln l 0 : 0 = verboten 0:1=0 1 : 0 = verboten 1:1=1 Dieses Rechenverfahren ist für eine elektronische Rechenanlage nicht geeignet. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 55 Beispiel 11011101 - 10011 010001 - 000000 100010 10011 0011111 10011 011000 10011 001010 : 10011 = 1 0 1 1, 1 0 1.... Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 56 Subtraktion und Division mit Hilfe des Komplements Definition 2-Komplement einer Dualzahl Das 2-Komplement einer Dualzahl ist die Ergänzung zur nächst höheren Bit-Wertigkeit (=Zweierpotenz). Bildungsrezept Das 2-Komplement einer Dualzahl bildet man durch Invertieren (Ersetzen von 0 durch 1 und umgekehrt) der Zahl und anschließender Addition einer 1. Beispiel: 2-Komplement zur Zahl 101012 (= 2110) 01010 + 1 0 1 0 1 1 (= 1110) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 57 Subtraktion durch Addition des Komplements 1. Schritt: Subtrahend durch Voranstellen von Nullen auf die gleiche Stellenanzahl des Minuenden bringen 2. Schritt: Bilde das 2-Komplement des erweiterten Subtrahenden 3. Schritt: Addiere Minuend und das 2-Komplement des Subtrahenden. Der Übertrag über die höchste vorgegebene Stellenanzahl wird nicht berücksichtigt. Beispiel: 1 0 1 0 1 12 - 1 0 0 0 1 2 (= 4310 - 1710) = 2610 S h itt 1 + 2 Schritte S h itt 3 Schritt 010001 101110 + 1 101111 101011 + 101111 1 011010 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 58 Division durch fortlaufende Addition des Komplements Verfahren 1. Schritt: Divisor durch Voranstellen von Nullen auf die gleiche Stellenanzahl des Dividenden bringen. 2. Schritt: Bilde 2-Komplement des erweiterten Divisors 3. Schritt: Addiere 2-Komplement zum Dividenden. Überträge über die höchste Stellenzahl werden notiert, aber für die weitere Rechnung zunächst nicht verwendet. 4. Schritt: Wiederhole Schritt 3 bis kein Übertrag mehr auftritt. Das Ergebnis der letzten Addition, bei der es noch zu einem Übertrag kam, ist der Divisionsrest. Die Übertragseinsen werden addiert und bilden das Ergebnis der Division. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 59 Beispiel: 1 0 1 0 0 12 : 1 1 12 ( = 4110 : 710) Schritte 1 + 2 Schritt 3 + 1 000111 111000 + 1 111001 + 1 + 1 + 1 + 1 + 101001 111001 100010 111001 011011 111001 010100 111001 001101 111001 000110 111001 111111 Ergebnis: 1 0 1 0 0 02 : 1 1 12 = 1 + 1 + 1 + 1 + 1 Rest 110 = 1 0 1 Rest 110 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 60 Informationsdarstellung / Codierung Computer können intern nur Bits verarbeiten. Daher muss jedes Zeichen in eine Bitfolge umgewandelt werden. Unter einem Zeichen versteht man Buchstaben, Ziffern (z. B. „0“, „1“), Sonderzeichen (z. B. „$“, „€“,…) und Steuerzeichen (z. B. „\n“ für Zeilenumbruch) Das Ersetzen eines Zeichens in eine Bitfolge nennt man Codierung. Die Umwandlungsvorschrift ist ein Code. Es wurden eine Reihe von Computercodes entwickelt. Beispiele hierfür sind der ASCII-Code sowie der Unicode. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 61 ASCII-Code American Standard Code for Information Interchange 7- Bit Code, d. h. 27=128 Zeichen sind darstellbar, davon • 32 Steuerzeichen (ASCII 0 bis ASCII 31 entspricht Tastenkombination Ctrl-A bis Ctrl-Z, z. B. Ctrl-H Backspace, Ctrl-M Return), • 84 internationale Schriftzeichen (lateinisches Alphabet, Ziffern, Sonderzeichen), • 12 nationale Schriftzeichen. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 62 Addition der Zeile und Spalte ergibt den ASCII-Wert des entsprechenden Zeichens, z. B. ASCII 52 = 4. Bei der ASCII-Codierung werden nur 7 Bits eines Bytes benutzt, das achte Bit dient als Kontrollbit für die Datenübertragung. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 63 ASCII-Erweiterung Erweiterung des ASCII-Satzes auf 8-Bit Code, d. h. 28 = 256 Zeichen sind darstellbar. Somit ergibt sich ein weiterer verfügbarer Bereich von ASCII 128 bis ASCII 255. IBM-PCs sowie dazu kompatible Rechner benutzen diesen zusätzlichen Code zur Darstellung von sprachspezifischen Zeichen, wie z. B. „ä“ (ASCII 132), „ö“ (ASCII 148). Bemerkung: Es kann zu Problemen beim Datenaustausch zwischen Rechnern mit unterschiedlicher ASCII-Erweiterung kommen. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 64 Unicode • 16-Bit Code, d. h. er umfasst 216 = 65536 Zeichen • umfasst Schriftzeichen aller Verkehrssprachen der Welt Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 65 Zahlendarstellung im Rechner Darstellung ganzer Zahlen (Datentyp INTEGER) • Kö Können direkt di kt iin D Dualzahlen l hl umgewandelt d lt werden d • Werden in ihrer Bitdarstellung gespeichert und verarbeitet Die meisten Programmiersprachen unterscheiden zwischen Short Integer: Speicherlänge 2 Byte (=16 Bits) Long Integer: Speicherlänge 4 Byte (= 32 Bits) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 66 Mit 2 Bytes können 216 verschiedene Zahlen dargestellt werden, mit 4 Bytes 232 verschiedene Zahlen. g Bereiche von Integer g Zahlen darstellen: Daher lassen sich folgende Short Integer Zahlen von –215 bis 215-1 Long Integer Zahlen von –231 bis 231-1 (-32768 bis 32767) (-2147483648 bis 2147483647) Die positiven ganzen Zahlen werden direkt in ihrer Bitdarstellung gespeichert (bei Short Integer von 0000 0000 0000 0000 bis 0111 1111 1111 1111). Das vorderste Bit ist hier immer 0. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 67 Die negativen ganzen Zahlen werden abgespeichert als 2-Komplement ihres Betrages. Beispiel Für Short integer hat –1 die Darstellung 1111 1111 1111 1111 Der Zahlenbereich bei Short Integer erstreckt sich also von 1111 1111 1111 1111 bis 1000 0000 0000 0000 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 68 Standardformate für die Darstellung ganzer Zahlen Bereich -128..127 -32768..32767 32768 32767 -231..231-1 -263..263-1 Format 8 Bit 16 Bit 32 Bit 64 Bit Java byte short int long Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 69 Darstellung von Kommazahlen (Datentyp REAL) Alle Zahlen Z dieses Typs werden im Rechner in der Gleitpunktdarstellung (Gleitkommadarstellung) dargestellt: Z = V * M * BE mit V: Vorzeichen, E: Exponent, M: Mantisse, B: Basis Beispiel 75 = 75*10 75 100 = 7,5 7 5*10 101 = 0,75 0 75*10 102 = ... - 0,36 = - 0,36* 100 = - 3,6*10-1= - 36*10-2=... Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 70 Eigenschaften der Gleitpunktdarstellung • Die Gleitpunktdarstellung ist eine Methode zur näherungsweisen Darstellung von reellen Zahlen. • Sie ist eine Darstellung, die bei festem Bitformat - ein möglichst großes Intervall der reellen Zahlen umfasst und - deren Genauigkeit bei kleinen Zahlen sehr hoch, bei großen Zahlen niedrig ist. • In einer Rechenanlage werden Mantisse und Exponent im Dualsystem dargestellt. • REAL-Zahlen werden im Rechner meist in 32 (short real, float) oder 64 Bits (long real, double) abgespeichert: Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 71 Damit Gleitkommazahlen in einer Rechenanlage eine eindeutige Darstellung haben, werden sie normiert dargestellt. Eine zur Basis 2 normierte Gleitkommazahl ist eine Zahl, bei der der Exponent so gewählt wird, dass die Zahl in der Form 1, m1m2m3….mn*2E dargestellt werden kann. Beispiel: 10,01 = 1,001 * 21 Bemerkung: Bei der Verwendung normierter Gleitkommazahlen muss die 1 vor dem Komma nicht gespeichert werden, da sie immer vorhanden ist. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 72 IEEE-Norm (Institute of Electrical and Electronics Engineers) Mitte der Achtzigerjahre wurde vom Institute of Electrical and Electronics Engineers die sog. IEEE-Norm verabschiedet, die mittlerweile Standard in den meisten Rechnern ist. Für Exponent und Mantisse sind hierbei eine feste Bitanzahl vorgegeben vorgegeben. Exponent v Mantisse e m short real (32 Bits): Vorzeichen: 1Bit, Exponent: 8 Bit, Mantisse:23 Bit long real (64 Bits): Vorzeichen: 1Bit, Exponent: 11 Bit, Mantisse:52 Bit Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 73 Das Vorzeichenbit Das erste Bit (engl.. most significant bit) wird als Vorzeichenbit interpretiert. 0 = positiv, 1 = negativ Die Exponentenbits (für short real) Die nächsten acht Bits codieren den Exponenten e. Mit 8 Bits können maximal 28 = 256 verschiedene Exponenten codiert werden. Damit können Zahlen im Bereich von –127 bis 128 dargestellt werden. Damit das Vorzeichen des Exponenten nicht gespeichert werden muss, wird zum Exponenten + 127 addiert, so dass der Exponent aus Zahlen von 1 bis 254 besteht. 0 und 255 sind für betragsmäßig sehr kleine Werte sowie „Unendlich“ reserviert. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 74 Die Mantissenbits (für short real) Die restlichen 23 Bits dienen zur Codierung der Mantisse. Die Mantisse wird normiert dargestellt, wobei die 1 vor dem Komma nicht mitgespeichert wird. Damit entspricht eine short real Codierung der Zahl für e 0;255 Z = (-1)v * 1,m * 2e-127 Bemerkung: Die 64 Bit Codierung von long real erfolgt analog. Es gilt Z = (-1)v * 1,m * 2e-1023 für e 0;2047 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 75 Sonderfälle e m Gleitkommazahl Z 0 0 0 0 -1v * 0 255 0 -1v * ∞ 255 0 -1v*0,m * 21-127 NaN NaN = Not a Number, d. h. nicht definiert Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 76 Beispiel: 4,75 als IEEE Zahl (short real) 4,75 = 100,11 29 28 27 26 25 24 23 22 21 20 2-1 2-2 2-3 2-4 2-5 2-6 , 1 Normieren ergibt: 1,0011*22 1 , 0 0 1 1 1 1 0 Exponent mit 127 addieren: 127+2 = 129 = 10000001 Damit ergibt sich IEEE Zahl: 0 10000001 00110000000000000000000 Beachte: Bei der Mantisse wird die 1 vor dem Komma nicht mitgespeichert. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 77 Beispiel: gegeben sei IEEE Zahl (short real) 1 10000101 10110000000000000000000 gesucht: zugehörige Dezimalzahl Exponent = 10000101 = 13310 => Exponent - 127 = 6 Also entspricht die IEEE Zahl der Dezimalzahl - (1* 20 + 1* 2-1 + 0*2-2+1*2-3+1*2-4)*26= -108 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 78 3. Grundlagen der Boolesche Algebra • Definition • Grundlagen der Schaltalgebra • de Morgansche Gesetze Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 79 Die boolesche Algebra wurde von dem Engländer George Boole 1854 entwickelt. Ziel: Zweifelsfreie Feststellung der Wahrheit oder Falschheit von Aussagen. Die Boolesche Algebra kennt zwei zulässige Zustände wahr = logisch 1 = nicht wahr = logisch 0 = Spannung vorhanden keine Spannung Sie beruht auf drei Basisoperationen Negation NICHT-Funktion Konjunktion UND-Funktion Disjunktion ODER-Funktion Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 80 Definition Boolesche Algebra Eine Menge M mit zwei Verknüpfungen und + heißt boolesche Algebra, wenn für alle x, y, z M gilt: Assoziativgesetz x (y z) = (x y) z x + (y+z) = (x+y) + z Kommutativgesetz x y=y x x+y = y+x Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 81 Verschmelzungsgesetz oder Absorptionsgesetz x (x+y) = x x + (x y) = x Distributivgesetz x (y+z) = (x y)+(x z) x+(y z) =(x+y) (x+z) es gibt ein Element 0 M mit 0 x = 0 und 0 + x = x für alle x M es gibt ein Element 1 M mit 1 x = x und 1 + x = 1 für alle x M neutrales Element bzgl. + und komplementäres Element zu jedem x M existiert genau ein y M mit x y = 0 und x + y = 1 Seite 82 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Grundlagen der Schaltalgebra Die Schaltalgebra ist eine Anwendung der booleschen Algebra zur Beschreibung und Untersuchung logischer Schaltungen. M sei eine Menge mit zwei Elementen Elementen, die mit 0 und 1 oder O und L bezeichnet werden. Es gibt drei Basis-Verknüpfungen Disjunktion oder ODER-Funktion mit den Symbolen + bzw. Konjunktion oder UND-Funktion mit den Symbolen bzw. Negation oder NICHT-Funktion mit den Symbolen bzw. & bzw. bzw. Die DIN 40700 legt Schaltzeichen für die logischen Funktionen fest. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 83 Disjunktion bzw. ODER-Funktion Die Disjunktion beschreibt eine logische ODER-Verknüpfung Gleichung: A = E1 E2 bzw. bzw A = E1 + E2 Der Ausgang ist dann "wahr", wenn entweder E1 oder E2 "wahr" sind. Wahrheitstabelle E1 E2 0 0 0 1 1 0 1 1 A 0 1 1 1 Schaltzeichen E1 E2 A Parallelschaltung E1 S1 U0> 0 E2 S2 R Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 84 Konjunktion bzw. UND-Funktion Die Konjunktion beschreibt eine logische UND-Verknüpfung Gleichung: A = E1 & E2 bzw. A = E1 E2 bzw. A = E1 E2 bzw. A = E1 E2 Wenn beide Eingänge "wahr" sind, dann ist auch der Ausgang "wahr" U0> 0 Wahrheitstabelle E1 E2 0 0 0 1 1 0 1 1 Reihenschaltung Schaltzeichen A 0 0 0 1 E1 E2 & A E1 S1 E2 S2 A R Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 85 Negation bzw. NOT-Funktion Die Negation beschreibt eine logische NICHT-Verknüpfung Gleichung: A = E bzw. A = E bzw. A = E Wenn der Eingang "wahr" ist, dann ist der Ausgang "falsch" Wahrheitstabelle E 0 1 A 1 0 Schaltzeichen E 1 A Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 86 Weitere Verknüpfungen NOT AND bzw. NAND Wahrheitstabelle Gleichung A = E1 E2 NOT OR bzw. NOR Gleichung: A = E1 + E2 E1 E2 0 0 0 1 1 0 1 1 A 1 1 1 0 E1 E2 0 0 0 1 1 0 1 1 A 1 0 0 0 Schaltzeichen E1 & A 1 A E2 E1 E2 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 87 Weitere Verknüpfungen Antivalenz (Exklusives ODER) bzw. EXOR Gleichung Wahrheitstabelle A = E1 E2 = E1E2 + E1E2 E1 E2 0 0 0 1 1 0 1 1 Äquivalenz (Gleichheit) bzw. EXNOR Gleichung: A = E1E2 + E1E2 E1 E2 0 0 0 1 1 0 1 1 A 0 1 1 0 A 1 0 0 1 Schaltzeichen E1 E2 E1 E2 =1 A = A Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 88 Einige Rechengesetze für beliebige boolesche Ausdrücke de Morgansche Gesetze i) A B ii ) A B A B A B weitere Gesetze iii ) A A A iv ) A A A v ) A B A B B Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 89 4. Erstellung von Software – Anwendungsprogrammierung Definition Ein Programm ist eine Folge von Befehlen oder Anweisungen an eine EDV-Anlage zur automatischen Bearbeitung eines Problems. Zur Erstellung eines Programms sind die folgenden Komponenten von Bedeutung: Editor, Compiler, Linker, Loader Editor • Erzeugt lesbare Textdateien in der jeweiligen Programmiersprache Assembler A bl • Maschinenorientierte Programmiersprache Zur Übersetzung des Quellcodes in die Maschinensprache des Rechners gibt es zwei Typen von Übersetzungsprogrammen: Compiler und Interpreter Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 90 Interpreter • Übersetzt immer nur eine einzige Programmanweisung in Maschinensprache • Jeder übersetzte Befehl wird sofort ausgeführt • Die Übersetzung wird nicht abgespeichert Compiler • Übersetzt immer einen kompletten Programmtext in eine Folge von Maschinenbefehlen, bevor die erste Programmanweisung ausgeführt wird • Erzeugt aus dem Quellcode durch einen Übersetzungsvorgang den sogenannten Objektcode. • Überprüft auf Grammatik- oder Syntaxfehler • Objektcode enthält binären Code für einen speziellen Prozessor für ein bestimmtes Quellcode-Modul Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 91 Linker • Führt nach dem Compilieren mehrere unabhängige Programmteile eines Softwareprojektes zu einem Gesamtprojekt zusammen • Hinzufügung benötigter mathematischer oder anderer allgemeiner Programmteile aus Softwarebibliotheken • Erzeugt aus den Objektcode des Programmierers und dem Objektcode der Bibliothek ausführbaren Programmcode. Loader • Lädt das Programm an eine freie Position im RAM • Funktion wird in der Regel durch das Betriebssystem bereitgestellt. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 92 Zur Entstehung eines lauffähigen Compiler-Programms sind also folgende Schritte notwendig: Editor Quellcode Compiler Objektcode Objektcode Bibliothekscode Linker Programmcode Lauffähiges Programm im Speicher Loader Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 93 Hilfsmittel zur Softwareentwicklung sind: Debugger • System zur Identifizierung von logischen u. Laufzeit - Fehlern • Debugger drängen sich zwischen Betriebssystem und Programm und übernehmen die Steuerung und Kontrolle der Programmausführung Programmausführung. IDE - Integrated Development Environment • Entwicklungsumgebung, die sämtliche Schritte der Programmentwicklung von einer gemeinsamen Entwicklungsoberfläche möglich macht. macht • Ermöglicht die graphische Entwicklung von Software • Verbirgt die Komplexität der Entwicklung Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 94 Programmiersprachen – Übersicht (Auswahl) Fortran 1960 ALGOL Basic Lisp 1965 COBOL PL/1 Simula 1970 Pascal C 1975 1980 Modula 2 Ada 1985 Object Pascal 1990 1995 Ada 95 Prozedurale Sprache ABAP C++ Delphi 2000 Prolog Smaltalk CLOS JAVA Objektorientierte Sprache KI Sprache Business Sprache Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 95 4. Softwareentwicklung mit JAVA • Grundlagen von JAVA • Datentypen • Kontrollstrukturen • Methoden • Grundlagen der Objektorientierung • Klassen, Objekte • Zugriffschutz • Kapselung • Vererbung • Ausnahmebehandlung • Die Klassen Object, String, StringBuffer Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 96 Kurze Einführung in die Geschichte von JAVA • JAVA wurde ab 1991 von der Firma Sun Microsystems entwickelt. • Zu Beginn erfolgte die Entwicklung im Rahmen eines internen Forschungsprojektes mit dem Ziel, eine Programmiersprache zur Steuerung von Geräten der Haushaltselektronik zu entwickeln. • Hauptziel der Programmiersprache: klein, schnell, effizient und leicht portierbar für einen breiten Bereich von Hardware. • Die Programmiersprache erhielt den Namen JAVA (nach der gleichnamigen Kaffeesorte). • 1993 sollte Projekt abgebrochen werden, da sich Markt für intelligente Haushaltsgeräte nicht gut entwickelte. • Zu dieser Zeit etablierte sich das World Wide Web (WWW). • Sun erkannte Potential in JAVA und das Projekt wurde fortgeführt. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 97 Das Arbeitsprinzip von JAVA • Der Source Code eines JAVA-Programms steht in einer Textdatei mit der Endung .java • Von einem Compiler mit dem Namen javac wird anhand dieser Text-Datei eine Datei mit der Endung .class erzeugt. • Diese Datei enthält den so genannten Bytecode, der auf einer virtuellen Maschine (JVM) läuft. Dies ist ein Interpreter, der für jedes Betriebssystem den Bytecode in den RAM des Rechners lädt und das Programm ablaufen lässt. • Die virtuelle Maschine wird durch den Befehl java aufgerufen und führt den Bytecode aus. • Die JVM ist Teil der JAVA Runtime Environment (JRE), die es für jedes gängige Betriebssystem gibt. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 98 Eigenschaften von JAVA Definition der Firma Sun Microsystems (jetzt: Oracle): JAVA ist eine einfache, objektorientierte, verteilte, interpretierte, stabile, sichere, plattformunabhängige portierbare, plattformunabhängige, portierbare leistungs leistungs- und multithreadingfähige und dynamische Sprache. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 99 Voraussetzung für das Arbeiten mit JAVA • Zur Erstellung von JAVA-Programmen benötigt man die JAVA 2 SDKUmgebung für das entsprechende Betriebssystem. • SDK = Software Development Kit (= JDK, JAVA Development Kit) • Das SDK beinhaltet die notwendigen Programme, insbesondere den Compiler javac, den Interpreter java und die Virtuelle Maschine. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 100 Labor für Informatik – Wo findet man … … die JAVA Software Entwicklungs-Umgebung g g g (JAVA SE JDK)!? http://www.oracle.com/technetwork/java/index.html (kostenlos, keine Anmeldung erforderlich, aktuell: JAVA SE JDK 7) … die Dokumentation (JAVA API) zum JAVA SE JDK!? http://www.oracle.com/technetwork/java/index.html (kostenlos, keine Anmeldung erforderlich, kann als zip-Archiv runtergeladen werden) … einen Text-Editor (Notepad++)!? http://notepad-plus-plus.org (kostenlos, mit Syntax-Highlighting für verschiedene Programmiersprachen) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 101 Erstellung von JAVA-Programmen JAVA Programme werden als Text in Dateien eingegeben. Hierzu benutzt man entweder • einen Texteditor oder • eine integrierte Entwicklungsumgebung (IDE Integrated Development Environment). Wir werden in der Vorlesung und im Praktikum mit einem Texteditor arbeiten. Das JDK werden wir in der aktuellen Version 7 verwenden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 102 Die vier Programmarten von JAVA • Applikationen (engl. für Anwendung) eigenständiges Programm, das nur die virtuelle Maschine als Interpreter braucht und selbstständig lauffähig ist (wie in anderen Programmiersprachen üblich) • Applets (engl. für „kleine Applikation“) Unterprogramm eines Webbrowsers, Webbrowsers welcher die virtuelle Maschine als Interpreter braucht. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 103 • Servlets Unterprogramm eines Webservers (Gegenstück zu einem Applet auf dem Webclient = Browser) • erweitert die Funktionalität eines Webservers • mögliche Anwendungen: sichere und vertrauliche Zugänge zu einer Website, Zugriffe auf Datenbanken, dynamische Erstellung von HTMLSeiten • eng verwandt: JSP (JAVA Server Pages), d. h. HTML-Seiten, in die JAVA-Programme eingebettet sind, welche bei Aufruf auf dem Server ausgeführt werden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 104 • Midlets (MID = mobile information device) JAVA-Programm, das auf Mobilgeräten wie Handys oder Handhelds ablaufen kann. • ist geeignet für Geräte mit wenig Speicher, geringer Performanz, t temporären ä V Verbindungen bi d zum N Netz t • Spezielle Entwicklungsumgebung von SUN: J2ME (JAVA 2 Micro Edition), benötigt J2SDK • Abgespeckte Virtuelle Maschine KVM (K für kilo, da der benötigte Speicher im Kilobyte Bereich liegt) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 105 Labor für Informatik – Literaturhinweise C. Ullenboom: "JAVA ist auch eine Insel" 10. Auflage, 2011, Galileo Computing ISBN 978 – 3 – 8362 – 1802 – 3 Kennung Hochschulbibliothek: FJ 5 C. Heinisch, F. Müller-Hofmann, J. Goll: "JAVA als erste Programmiersprache" g p 5. Auflage, 2007, B. G. Teubner Verlag ISBN 978 – 3 – 8351 – 0147 – 0 Kennung Hochschulbibliothek: FJ 128 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 106 Labor für Informatik – Literaturhinweise D. Abts: "Grundkurs JAVA" 5. Auflage, 2008, Vieweg Verlag ISBN 978 – 3 – 8348 – 0417 – 4 Kennung Hochschulbibliothek: FJ 262 U. Grude: "JAVA ist eine Sprache" 1. Auflage, 2005, Vieweg Verlag ISBN 978 – 3 – 528 – 05914 – 9 Kennung Hochschulbibliothek: FJ 272 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 107 Labor für Informatik – Literaturhinweise D. Ratz,, J. Scheffler,, D. Seese,, J. Wiesenberger: g "Grundkurs Programmieren in JAVA" 5. Auflage, 2010, Hanser Verlag ISBN 978 – 3 – 446 – 41655 – 0 Kennung Hochschulbibliothek: FJ 85 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 108 Links • JAVA Tutorial von Oracle http://download.oracle.com/javase/tutorial • G. Krüger, T. Stark: Handbuch der JAVA-Programmierung http://www.javabuch.de • C. Ullenboom: JAVA ist auch eine Insel (online) http://openbook.galileocomputing.de/javainsel • S. S Middendorf, Middendorf R. R Singer, Singer J. J Heid: Programmierhandbuch und Referenz http://www.dpunkt.de/java Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 109 Einfache JAVA-Applikationen // Willkommen.java /* Ausgabe eines Textes */ class Willkommen{ public static void main (String args[]){ System.out.println ("Willkommen zur JAVA-Vorlesung"); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 110 Was sind die Schritte, um die Applikation zu starten? 1. Erstellen der Datei Willkommen.class im Bytecode: javac Willkommen.java 2 2. java Willkommen führt zur Ausführung des Programms Das Ergebnis ist die Ausgabe des Textes Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 111 Grundbestandteile eines JAVA-Programms 1. Ein JAVA Programm ist stets eine Klasse und beginnt mit dem Schlüsselwort class und dem Namen der Klasse. 2. Ein JAVA-Programm ist in Einheiten gepackt, so genannte Blöcke, die von geschweiften Klammern {...} umschlossen sind. 3. Der Startpunkt jeder Applikation ist die Methode main(). Hier beginnt der JAVA-Interpreter (die „virtuelle Maschine“) die einzelnen Anweisungen auszuführen. Abgearbeitet wird sequenziell, d. h. der Reihe nach. 4. Die Applikation Willkommen.java besteht aus einer Anweisung, der Ausgabe eines Textes. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 112 Kommentare Kommentare dienen zur Dokumentation von Programmen und Verbessern ihre Lesbarkeit. Sie bewirken keine Aktion bei der Ausführung des Programms und werden vom JAVA-Compiler ignoriert. Es gibt drei verschiedene Arten, Kommentare in JAVA zu erstellen. 1. //.. einzeiliger Kommentar, beginnt mit dem Doppelslash // und endet mit dem Zeilenende (Quellcode, der in derselben Zeile vor dem Doppelslash steht, wird normal verarbeitet) 2. /*...*/ Kommentierung von mehreren Textzeilen 3. /**...*/ Dokumentationskommentar zur automatischen Dokumentation Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 113 Empfehlung: Jedes Programm sollte mit einem Kommentar beginnen, der den Klassennamen beinhaltet, die Version, das Datum und den Zweck des Programms beschreibt. / /* *Classname * *Versioninformation * *Date * *Copyrightnotice */ Leerzeilen, Leerzeichen und Tabstops werden vom JAVA-Compiler nicht verarbeitet. Sie sollten verwendet werden zur Strukturierung und Lesbarkeit des Programms. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 114 Die Klassendeklaration • Jedes JAVA-Programm besteht aus mindestens einer Klasse • Das reservierte Wort class eröffnet die Klassendeklaration in JAVA, gefolgt von dem Klassennamen (in unserem ersten Beispiel Willkommen) • Reservierte Wörter sind von JAVA belegt (nur kleine Buchstaben) • Der Klassenname ist ein Identifier (Bezeichner) • Ein Bezeichner darf nicht mit einer Ziffer beginnen und keine Leerzeichen enthalten • Ein Identifier ist eine Folge von alphanumerischen Zeichen, d. h. Buchstaben, Ziffern, dem Unterstrich_ und dem $ Zeichen • JAVA ist case sensitive, d. h. Groß- und Kleinschreibung wird unterschieden Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 115 Regeln für das Erstellen einfacher Applikationen Speichern Sie zunächst Ihre Klasse in einer Datei ab, die genau so heißt, wie die Klasse mit der Erweiterung „.java“. E gilt Es ilt ffolgende l d K Konvention: ti Klassennamen beginnen mit einem Großbuchstaben und bestehen aus einem Wort. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 116 Blöcke • Die Deklaration einer Klasse geschieht in einem Block, der durch geschweifte Klammern {} umschlossen ist • Innerhalb eines Blockes können sich noch weitere Blöcke befinden • Die Klammern müssen korrekt geschlossen sein. Zwei Konventionen sind üblich class Willkommen { .... } oder die bei JAVA bevorzugte Konvention class Willkommen { ..... } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 117 Die Methode main • Die zentrale Einheit einer Applikation ist die Methode main. • Durch sie wird die Applikation gestartet, durch die dann alle Anweisungen ausgeführt werden, die in ihr programmiert sind. • Die Zeile public static void main ( String args[] ) ist Teil jeder JAVA-Applikation. • JAVA-Applikationen beginnen automatisch bei main. • Die runden Klammern hinter main() zeigen an, dass main eine Methode ist ist. • Nach dem Aufruf der Methode main mit dem Standardargument String args[] kommt der Methodenrumpf, eingeschlossen durch geschweifte Klammern ({...}). Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 118 Eine allgemeine Applikation in JAVA muss in jedem Fall die folgende Konstruktion beinhalten class Klassenname { public static void main( String args[] ){ Deklarationen und Anweisungen; } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 119 Erweiterung der ersten JAVA-Applikation /* Ausgabe eines Textes in einem Dialogfenster */ import javax javax.swing.JOptionPane; swing JOptionPane; class Willkommen2{ public static void main (String args[]){ JOptionPane.showMessageDialog (null, "Willkommen zur \nJAVA-Vorlesung"); System.exit( 0 ); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 120 Die Ausgabe erfolgt dann in einem Dialogfenster, das durch das Klicken des OK Buttons geschlossen werden kann kann. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 121 Die Methode System.exit • Die Methode exit() gehört zur Klasse System und beendet die Applikation bei Dialogfenstern. • Die Klasse System gehört zu dem Paket java.lang, das automatisch jedem JAVA-Programm zur Verfügung steht. • Wird diese Anweisung bei Dialogfenstern nicht angegeben, so blockiert die Applikation die JAVA Virtual Maschine. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 122 Die import-Anweisung • Benutzt man Klassen aus anderen Paketen als dem Paket java.lang, so muss diese Klasse ausdrücklich mit ihrem Paketpfad angegeben werden. • import Anweisung wird die Klasse JOptionPane eingelesen und für Mit der import-Anweisung das Programm benutzbar. • JOptionPane ist eine Standardklasse von JAVA aus dem Paket javax.swing und stellt Dialogboxen, d. h. Fenster zur Ein-und Ausgabe zur Verfügung. • JAVA Kl JAVA-Klassen können kö generellll iin Paketen, P k t d h d. h. iin V Verzeichnissen i h i bereitgestellt werden. Z.B. sind alle Klassen des Swing-Pakets javax.swing in dem Verzeichnis \javax\swing zu finden Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 123 • Die Methode showMessageDialog() öffnet eine Dialogbox, die den in Hochkommata eingeschlossenen Text anzeigt, der an zweiter Stelle, d. h. nach dem reservierten Wort null steht. • null ist ein reserviertes Wort. null ist der Bezeichner für ein nicht vorhandenes Objekt. In unserem Fall bewirkt es, dass ein Standard-Frame benutzt wird, der zentriert auf der Mitte des Bildschirms erscheint. (Mit der Erstellung von Frames beschäftigen wir uns im zweiten Semester). Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 124 Escape-Sequenzen und Strings • Der in Anführungszeichen (" ") gesetzte Text ist ein String, d. h. eine Kette von beliebigen Zeichen • Strings sind in JAVA vom Datentyp String St i • Strings werden z. B. durch die Methoden System.out.println() oder JOptionPane.showMessageDialog() auf dem Bildschirm exakt so ausgegeben, wie eingetippt- bis auf die sogenannten Escape-Sequenzen: • Eine Escape-Sequenzen ist ein Hilfsmittel zur Darstellung nicht druckbarer Zeichen und wird durch den Backslash (\) gefolgt von genau einem weiteren Zeichen, z. B. \n für einen Zeilenwechsel, geschrieben. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 125 Escape-Zeichen Bedeutung \n neue Zeile (new line) \t führt Tabulatorsprung aus (tab) \r positioniert den Cursor an den Anfang der aktuellen Zeile (carriage return) \b positioniert den Cursor ein Zeichen zurück (backspace) \f Seitenvorschub (neue Seite) (form feed) \\ A Ausgabe b d des B Backslash k l h\ \" Ausgabe der Anführungszeichen \‘ Ausgabe der Hochkomma Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 126 Anmerkung zu den Escape-Sequenzen Die Escape-Sequenzen \t, \f, \r und \b werden von der Methode showMessageDialog() nicht beachtet. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 127 Programmier-Styleguide Als Programmierstil hat sich durchgesetzt: Variablennamen Kleinbuchstaben variable Methodennamen Kleinbuchstaben methode( ) Klassennamen 1. Buchstabe groß, Rest klein Willkommen Aus mehreren Wörtern zusammengesetzte Namen werden ohne Unterstrich geschrieben, dabei wird ab dem zweiten Wort jeweils der erste Buchstabe eines Wortes groß geschrieben. Für das erste Wort gilt die normale Konvention. Beispiel: dritteWurzel addiereWerte ( ) Variable Methode Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 128 Reservierte Schlüsselwörter Bestimmte Wörter sind als Bezeichner nicht zulässig, da sie als Schlüsselwörter durch den Compiler besonders behandelt werden. p eines Compilers. p Schlüsselwörter bestimmen die „„Sprache“ Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 129 Folgende Schlüsselwörter gibt es in JAVA: abstract, boolean, break, byte, case, catch, char, class, const1, continue, default, do, double, else, extends, final, , finally, y, float, , for, , g goto1, if, , implements, p , import, p , instanceof, int, interface, long, native, new, package, private, protected, public, return, short, static, strictfp,super, switch, synchronized,this, throw, transient, try, void, volatile, while. 1: Diese Schlüsselwörter sind reserviert, werden aber nicht benutzt. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 130 String Addition Strings können durch den Verkettungsoperator + verknüpft werden. Durch diesen Operator werden zwei Strings aneinander gereiht. Im nächsten Beispiel werden zwei einzugebende Strings aneinander gefügt. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 131 // StringAddition.java //Fuehrt zwei einzugebende Strings zusammen import javax.swing.JOptionPane; class StringAddition { public static void main(String args[]){ String ersteEingabe, zweiteEingabe; String ausgabe; //Einlesen des ersten Textes: ersteEingabe = JOptionPane.showInputDialog("Geben Sie einen Text ein"); zweiteEingabe = JOptionPane.showInputDialog("Geben Sie einen zweiten Text ein"); //Zusammenfuehrung beider Texte ausgabe = ersteEingabe + zweiteEingabe; //Ausgabe des zusammengefuegten Textes JOptionPane.showMessageDialog(null, ausgabe, "Ergebnis", JOptionPane.PLAIN_MESSAGE); System.exit( 0 ); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 132 Die Ein- und Ausgabe erfolgt dann in folgenden Dialogfenstern Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 133 Eingabedialoge Die Methode JOptionPane.showInputDialog mit dem String("Geben Sie einen Text ein")erzeugt das folgende Fenster: Der Anwender muss einen String eingeben, der mit der Return-Taste oder mit einem Mausklick auf den OK-Button beendet wird. Über de Übe dem Eingabefeld gabe e d e erscheint sc e t de der Text, e t, de der de der Methode et ode im Programm og a mitgegeben wurde. Der eingegebene String wird durch die Methode an das Programm zurück gegeben. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 134 Ausgabe-Dialoge Die Methode JOptionPane.showMessageDialog(null, ausgabe, "Ergebnis", JOptionPane.PLAIN_MESSAGE); erzeugt das Fenster. Hier hat die Methode 4 Argumente: 1. null Standard-Frame (keine Bindung an ein Fenster) 2 2. ausgabe b Nachricht die angezeigt werden soll Nachricht, 3. "Ergebnis" String in der Titelleiste 4. JOptionPane.PLAIN_MESSAGE Bestimmt Anzeige des Message-Dialogtyps Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 135 Zusammenstellung der Message-Dialogtypen Message-Dialogtyp Icon Bedeutung JOptionPane.ERROR_MESSAGE Fehlermeldung JOptionPane INFORMATION MESSAGE JOptionPane.INFORMATION_MESSAGE informative Meldung; der User kann sie nur wegklicken JOptionPane.WARNING_MESSAGE Warnmeldung JOptionPane.QUESTION_MESSAGE Fragemeldung JOptionPane.PLAIN_MESSAGE Meldung ohne Icon Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 136 Variablen, Datentyp, Deklaration • Allgemein sind Variablen Platzhalter bzw. Speicherbereiche. • Variablen können eine bestimmte Menge von Werten annehmen. Diese Menge bezeichnet man als Datentyp. • Eine Deklaration Datentyp variablenName ordnet der Variable mit dem Namen variablenName einen bestimmten Datentyp zu. • Eine Variable wird deklariert, indem man zuerst ihren Typ angibt und dahinter ihren Namen schreibt. • Variablen müssen stets deklariert sein sein, bevor sie verwendet werden werden. • Durch die Deklaration wird ein bestimmter Speicherplatz im RAM reserviert. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 137 Beispiel für eine Deklaration: int a; Gibt es in einem Programm mehrere Variablen des selben Datentyps, so kann man deren Namen bei der Deklaration durch Kommata getrennt hinter den Datentyp setzen: Beispiel: int a, b; Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 138 Wertzuweisungen In der Applikation StringAddition sind die Ausdrücke ersteEingabe = JOptionPane.showInputDialog ("Geben Sie einen Text ein"); zweiteEingabe = JOptionPane.showInputDialog ("Geben Sie einen zweiten Text ein"); ausgabe = ersteEingabe + zweiteEingabe; Wertzuweisungen Wertzuweisungen. Hier ist das = der Zuweisungsoperator. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 139 Die Variable ersteEingabe bekommt den String zugewiesen, der im Eingabefenster eingegeben wurde. Nach der Belegung der Variable durch den String, hat das Programm den eingegebenen Wert im Hauptspeicher Hauptspeicher. Die Anweisung ausgabe = ersteEingabe + zweiteEingabe; weist der Variablen ausgabe die Aneinanderreihung der beiden Strings zu. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 140 Die Applikation Zahlen addieren In der Applikation IntAddition sollen zwei ganze Zahlen über die Tastatur eingelesen und die Summe berechnet und ausgegeben werden. Ganze Zahlen sind in JAVA vom Datentyp int (integer). Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 141 // IntAddition.java //Addiert zwei einzugebende ganze Zahlen import javax.swing.JOptionPane; class l IntAddition{ ddi i { public static void main (String args[]){ //Variablendeklaration String ersteEingabe, //1. Eingabestring zweiteEingabe; //2. Eingabestring int zahl1, zahl2, summe; //1. zu addierende Zahl //2. zu addierende Zahl //Summe von zahl1 und zahl2 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 142 //Einlesen der ersten Zahl als String: ersteEingabe = JOptionPane.showInputDialog("Geben Sie die erste ganze Zahl ein"); zweiteEingabe = JOptionPane.showInputDialog("Geben Sie die zweite ganze Zahl ein"); //Konvertierung // i d der Eingabe i b von String i nach h i int: zahl1 = Integer.parseInt(ersteEingabe); zahl2 = Integer.parseInt(zweiteEingabe); //Addition der beiden Zahlen: summe = zahl1 + zahl2; //Ausgabe JOptionPane.showMessageDialog(null, "Die Summe ist " + summe, "Ergebnis",JOptionPane.PLAIN_MESSAGE); System.exit ( 0 ); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 143 Die Applikation liefert folgende Ergebnisse Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 144 Datentypen und Typkonvertierung Anmerkungen zu der Applikation IntAddition • Die Methode showMessageDialog() kann nur Strings einlesen und auch nur Strings an das Programm weitergeben. • Jede Eingabe von der Tastatur ist daher ein String, d. h. auch wenn 5 eingetippt wird, ist 5 keine Zahl sondern ein String. • Sind 5 und 11 Zahlen, so ergibt 5 + 11 den Wert 16. Sind 5 und 11 Strings, Strings so ergibt "5 5 " + " 11 " den String "511" 511 • Zahlen werden durch + arithmetisch addiert, Strings werden aneinandergereiht. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 145 • Da über die Tastatur die Eingabe als String erfolgt, müssen die Strings in Integer Zahlen konvertiert (umgewandelt) werden. • Für die Typumwandlung von String in eine Integer-Zahl gibt es in JAVA die Methode parseInt(). parseInt() Dies ist eine Methode der Klasse Integer aus dem Paket java.lang. Beispiel: zahl1 = Integer.parseInt(ersteEingabe); • Die Zeile summe = zahl1 + zahl2; besteht aus den zwei Operationen = und +. Der Operator + addiert die Werte der beiden Zahlen, der Zuweisungsoperator = weist diesen Wert der Variablen summe zu. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 146 • Das Ergebnis wird ausgegeben: "Die Summe ist " + summe "Die Summe ist " ist ein String, summe eine Integer-Zahl. String + Zahl ergibt String, d. h. der + Operator reiht die Strings aneinander. summe wird automatisch in einen String konvertiert. Man nennt dies automatische Typanpassung oder implizite Typkonvertierung oder implizites Typcasting. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 147 Die Primitiven bzw. elementaren Datentypen • Variablennamen wie zahl1 und zahl2 beziehen sich auf bestimmte Stellen im Arbeitsspeicher des Rechners. • Jede Variable hat einen Namen, einen Typ, eine Größe und einen Wert. • Bei der Deklaration einer Variablen werden bestimmte Speicherzellen reserviert. • Der Name der Variable im Programmcode verweist während der Laufzeit auf die Adresse dieser Speicherzellen • Die primitiven Datentypen bzw. elementaren Datentypen bekommen standardmäßig die folgenden Speichergrößen zugewiesen: Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 148 S ch lüsselw ort S p eicherplatz W erteb ereich Datentypen für ganzzahlige Werte (mit Vorzeichen) byte 8 Bit -128..127 short 16 Bit -32768..32767 int 32 Bit -2 231..2 231-1 1 long 64 Bit -263..263-1 Datentypen für Gleitkommazahlen float 32 Bit double 64 Bit - 3.40292347E+38 bis + 3.40292347E+38 - 1.7976313486231570E+308 bis + 1.7976313486231570E+308 Datentypen für Boolesche Werte boolean 1 Bit false, true Datentypen für Unicode-Textzeichen char 16 Bit \u0000…\uFFFF Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 149 Der primitive Datentyp char - Eine Zeichenkonstante ist ein Zeichen, eingeschlossen in einfache Anführungszeichen. Beispiel char c = 'a'; - In JAVA ist eine Zeichenkonstante vom Typ char - Ein char ist nicht vorzeichenbehaftet - Der Datentyp char ist 2 Byte groß und nimmt ein Unicode-Zeichen auf. - Mit Zeichenkonstanten kann man rechnen wie mit ganzen Zahlen - Man kann sie in ganzzahligen Ausdrücken verwenden - Beispiel: Zeichen '1' hat im Unicode-Zeichensatz den Wert 49 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 150 // Zeichen.java // Rechnen mit dem Datentyp char class Zeichen{ public static void main (String args[]){ int b, f, g, h; char c, d, e; b = 5; c = '1'; d = 'A'; e = 66; f = b + c; g = c + d; h = b + d; System.out.println ("b = "+ b +" \nc = "+ c + "\nd = "+ d); System.out.println ("e = "+ e +"\nf = "+ f + "\ng = "+ g ); System.out.println ("h = "+ h ); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 151 Zeichen.java liefert die Ausgabe Bemerkung: Das Zeichen '0' hat in Unicode den Wert 48, 'A' hat den Unicode Wert 65. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 152 Typanpassungen (Casting) bei elementaren Datentypen • Müssen Datentypen angepasst werden, so bezeichnet man dies als Typanpassung (Casting). JAVA unterscheidet zwei Arten von Typanpassung: • Automatische Typanpassung Daten eines kleineren Datentyps werden automatisch dem größeren angepasst. • Explizite Typanpassung größerer Typ yp kann einem kleineren Typ yp nur mit Verlust von Ein g Informationen zugewiesen werden. Zwischen dem elementaren Datentyp boolean und den anderen elementaren Datentypen findet keine Typanpassung statt. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 153 Typumwandlungen in einen „breiteren“ Datentyp Der Wert ist immer darstellbar. Es kann allerdings an Genauigkeit verloren gehen, z. B. bei der Umwandlung von int nach float. von Datentyp y in Datentyp y byte short, int, long, float, double short int, long, float, double char int, long, float, double int g, float, , double long, long float, double float double Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 154 • Werte der Datentypen byte und short werden bei Rechenoperationen automatisch in den Datentyp int umgewandelt. • Ist ein Operand vom Datentyp long, dann werden alle Operanden auf long gesetzt. gesetzt Beispiele für die automatische Typanpassung: 1. Beispiel int b = 7; double c = b; ergibt c = 7.0 2. Beispiel long a, b = 6; int c = 3; a = b +c; wandelt automatisch alle Operanden in den Datentyp long um. um Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 155 Explizite Typanpassung Regel: Der gewünschte Typ für eine Typanpassung wird vor den umzuwandelnden Datentyp geschrieben. Der Zieldatentyp ist dabei geklammert d. geklammert, d h. h (Typname) ausdruck Beispiele: int n = (int) 5.316; int m = (int) (4.315 + 1.66); Bei der Konvertierung eines größeren Ganzzahltyps in einen kleineren werden die oberen Bits abgeschnitten. Beispiel: int i = 385; byte a= (byte) i; ergibt a = -127 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 156 Bei der Umwandlung von Gleitpunktzahlen in Ganzzahlen kann es zum Verlust von Genauigkeit kommen. Die Stellen hinter dem Komma (Punkt) werden abgeschnitten. Bei zu großen Zahlen ist ein korrektes Ergebnis nicht möglich. Beispiel double i = 345.886; int a = (int) i; ergibt a = 345; Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 157 Die Umwandlung von short in char oder umgekehrt ist nur mit Hilfe der expliziten Typumwandlung möglich (obwohl beide eine Größe von 16 Bit haben). Dies liegt am Vorzeichen von short. short Der Datentyp char hat kein Vorzeichen Vorzeichen. Der Wert von positiven Zahlen bleibt bei der Konvertierung erhalten. Beispiel: short i = 48; char a = (char) i; ergibt a = '0' Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 158 Arithmetische Operationen: Die Grundrechenoperationen in JAVA Die Grundrechenoperationen bestehen aus einem Operator und zwei Operanden (z. B. Operation 1 + 2 hat Operator + und Operanden 1 und 2). Allgemein ist eine Operation gegeben durch einen Operator und mindestens einen Operanden. Operationen mit dem selben Operator aber unterschiedlichen Datentypen können zu verschiedenen Ergebnissen führen (Beispiel die Stringaddition "1" + "2" liefert anderes Ergebnis als die IntegerAddition 1 + 2). Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 159 // Arithmetik.java // Führt verschiedene arithmetische Operationen durch class Arithmetik { public static void main (String args[]){ int a,b,c,d; //ganze Zahlen double x,y,z; //reelle Zahlen String ausgabe; a = 6 * (3 - 1); b = 6 * 3 + 5; x = 16 / 5; y = 16 / 5.0; z = 16.0 / 5; c = 16 / 5; d = 16 % 5; ausgabe = "Das Ergebnis ist:\na = "+ a + "\nb = "+ b; ausgabe = ausgabe + "\nx = "+ x + "\ny = "+ y + "\nz = "+ z; ausgabe = ausgabe + "\nc = "+ c + "\nd = "+ d; System.out.println (ausgabe); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 160 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 161 Der Additionsoperator A + B Wendet man den zweistelligen Additionsoperator auf seine Operanden an, so ist der Rückgabewert die Summe der Werte der beiden Operanden Beispiel: int a = 6 + (3 + 4); ergibt a = 13 Der Subtraktionsoperator A – B Wendet man den zweistelligen g Subtraktionsoperator p auf die Operanden p A und B an, so ist der Rückgabewert die Differenz der Werte der beiden Operanden. Beispiel: int a = 16 - (3 - 4); ergibt a = 17 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 162 Der Multiplikationsoperator A * B Der Operator multipliziert den Wert A mit dem Wert B. Es gelten die normalen Rechenregeln, d. h. Klammer vor Punktrechnung vor Strichrechnung. Beispiel: int a = 6 * (3 + 4); ergibt a = 42 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 163 Der Divisionsoperator A / B Bei Nutzung des Divisionsoperators muss eine Fallunterscheidung durchgeführt werden: Erster Fall: A und B sind beide g ganzzahlig g ((z. B. vom Typ yp int). ) Man spricht bei A / B von einer ganzzahligen Division. Das Ergebnis A / B ist wieder eine ganze Zahl. Der Nachkommateil des Ergebnisses wird abgeschnitten. Beispiel: int c = 16 / 5; ergibt c = 3 Dabei bestimmt sich der Quotient vom Betrag her nach der Vorschrift, dass der Quotient die größtmögliche ganze Zahl ist, für die gilt: |Quotient * Nenner| <= |Zähler| Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 164 Der Divisionsoperator A / B Zweiter Fall: A und/oder B sind Gleitpunktzahlen, d. h. vom Typ float oder double. Das Ergebnis ist dann eine Gleitpunktzahl. Beispiel: double d = 16.0 / 5; ergibt c = 3.2 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 165 • Division durch 0 • Sind beide Operanden ganze Zahlen (z. B. 3/0), so ergibt sich beim Interpretieren die Meldung • Ist einer der Operanden eine Gleitpunktzahl, so ergibt sich als Ergebnis Infinity mit Berücksichtigung des Vorzeichens Beispiel double x = -4.0 / 0 ergibt x = -Infinity double x = 4.0 / 0 ergibt x = Infinity Null durch Null ergibt NaN (Not a number) Beispiel 0.0 / 0.0 = NaN Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 166 Der Restwertoperator A % B Der Restwertoperator oder Modulo-Operator gibt den Rest der ganzzahligen Division A / B an. Das Ergebnis A % B ergibt sich aus A – (A / B) * B B. Das Ergebnis von A % B kann nur negativ sein, wenn der Zähler A negativ ist, es kann nur positiv sein, wenn der Zähler A positiv ist. Beispiele: (-9) % 2 = -1 denn (-9) / 2 = -4 (-9) ( 9) % ( (-2) ) = -1 de denn ( (-9)/ 9)/ ( (-2) ) = 4 9 % (-2) = 1 denn 9 / (-2) = -4 9 % 2 = 1 denn 9 / 2 = 4 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 167 Rechenreihenfolge (Präzedenz) der arithmetischen Operatoren Operator Operation Präzedenz () Klammern werden zuerst ausgewertet ausgewertet. Sind Klammern von Klammern umschlossen, werden sie von innen nach außen ausgewertet. *, /, % Multiplikation, Division, Modulus werden als zweites ausgewertet +, - Addition, Subtraktion werden zuletzt ausgewertet Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 168 Spezielle arithmetische Operatoren Zuweisungsoperator Beispiel Bedeutung += c += x c=c + x -= c -= x c=c - x *= c *= x c = c * x /= c /= x c = c / x %= c %= x c = c % x Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 169 Inkrementoperator ++ und Dekrementoperator -Operator Beispiel Bedeutung ++ ++c erhöht c um 1, bevor der neue Wert von c in dem Ausdruck verwendet wird, in dem sich c befindet ++ c++ verwendet den aktuellen Wert von c in dem Ausdruck, in dem sich c befindet, und erhöht erst dann c um 1 -- --c erniedrigt c um 1, bevor der neue Wert von c in dem Ausdruck verwendet wird, in dem sich c befindet -- c-- verwendet den aktuellen Wert von c in dem Ausdruck, in dem sich c befindet, und erniedrigt erst dann c um 1 Da die Operatoren ++ und – nur einen Operanden haben, heißen sie unär. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 170 Was liefert die folgende Applikation für eine Ausgabe? class Inkrement{ public static void main (String args[]){ int c; String ausgabe ; c = 5; ausgabe = c + ", "; ausgabe b + += c++ ++ + " ", " "; ausgabe += c + "\n"; c = 5; ausgabe += c + ", "; ausgabe += ++c + ", "; ausgabe += c + "\n"; c = 5; ausgabe += c + ", "; ausgabe += --c + ", "; ausgabe += c; System.out.println(ausgabe); } Vorlesung Informatik, 1. Teil WiSe 2011/2012 } Seite 171 Kontrollstrukturen Eine Kontrollstruktur ist eine Abfolge von Anweisungen. Jedes Programm kann mit Hilfe von drei Kontrollstrukturen geschrieben werden: 1. Sequenz (sequence structure) 2. Auswahl oder Selektion (selection structure) 3. Wiederholung oder Schleife (repetition structure) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 172 Die Sequenz - Blöcke Die Sequenz ist eine einfache Abfolge von Anweisungen. Diese Anweisungen werden in Form eines Blockes zusammengefasst. { Anweisung 1; Anweisung n; } Anweisung 1 Die Darstellung der Sequenz als Struktogramm: Anweisung n Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 173 Die Auswahl- oder Selektionsstruktur Die Selektion ermöglicht die Abarbeitung von Anweisungen in Abhängigkeit von einer Bedingung. In JAVA unterscheidet man zwischen der • einfachen Alternative mit if und else und der • mehrfachen Alternative mit else if oder switch. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 174 Die Selektion: Einfache Alternative – if und else Als Struktogramm kann die Selektionsstruktur mit der einfachen Alternative wie folgt dargestellt werden: Bedingung wahr falsch Anweisung a1 Anweisung b1 Anweisung an Anweisung bm Ist die Bedingung wahr, wahr so wird der Block Anweisung a1 … Anweisung an ausgeführt. Ist die Bedingung falsch, so wird der Block Anweisung b1 … Anweisung bm ausgeführt. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 175 Die Syntax der Selektion mit einfacher Alternative lautet in JAVA if (Bedingung) { Anweisung a1; …; Anweisung an; }else{ Anweisung b1; …; Anweisung bm; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 176 Bemerkung • Die Selektion wählt eine Anweisung bzw. eine Sequenz aus. • Besteht der Anweisungsblock nur aus einer einzigen Anweisung, so können die geschweiften Klammern weggelassen werden werden. • Die Bedingung nach if muss in runden Klammern stehen. • Die Bedingung nach if muss vom Typ boolean sein. • Der else-Zweig ist optional. Entfällt der else-Zweig, so spricht man von einer bedingten Anweisung. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 177 Bedingungen in JAVA können durch Vergleichsoperatoren gebildet werden Operator in JAVA == Beispiel Bedeutung x == y x ist gleich y != x != y x ist ungleich y > x > y x ist größer als y < x < y x ist kleiner als y >= x >= y x ist größer gleich y <= x <= y x ist kleiner gleich y Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 178 Bemerkung zu den algebraischen Vergleichsoperatoren • Der Operator == darf nicht mit dem Zuweisungsoperator = verwechselt werden. • Alle algebraischen Vergleichsoperatoren können nur zwei Ausdrücke von primitiven Datentypen vergleichen. • Strings sind Objekte und werden mit der Methode equals() verglichen: String1.equals(String2) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 179 Logische Verknüpfungen von Ausdrücken Operator in JAVA && Bedeutung || logisches oder ! logisches nicht logisches und Beispiel JAVA Bedeutung if (a < b && b < c) b liegt zwischen a und c if (b < a || b > c) b ist kleiner als a oder größer als c if (!(b < 4)) b ist nicht kleiner als 4 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 180 Die Wahrheitstabelle der logischen Verknüpfungen Operand 1 Operand 2 logisches und && false false false false true false true false false true true true Operand 1 Operand 2 logisches oder || false false false false true true true false true true true true Operand logisches nicht ! false true true false Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 181 Bemerkung zu den logischen Operatoren In JAVA gibt es sowohl für das logische UND als auch für das logische ODER zwei verschiedene Operatoren. • Logische UND: && bzw. & Wird der Operator & zwischen zwei Operanden verwendet, so wird der rechte Operand immer ausgewertet, egal ob der linke Operand true oder false ist. Wird der Operator && verwendet, so wird der rechte Ausdruck nur dann ausgewertet, wenn der linke Ausdruck true ist. Die Operatoren && und & haben identische Wahrheitstabellen. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 182 • Logische ODER-Operatoren: || bzw. | Wird der Operator | zwischen zwei Operanden verwendet, so wird der rechte Operand immer ausgewertet, egal ob der linke Operand true oder false ist. Wird der Operator || verwendet, so wird der rechte Ausdruck nur dann ausgewertet, wenn der linke Ausdruck false ist. Die Operatoren || und | haben identische Wahrheitstabellen. • Prioritäten ! vor && vor || Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 183 // Vergleiche.java //If Anweisungen und Vergleichsoperatoren import javax.swing.JOptionPane; class Vergleiche{ public static void main (String args[]){ String ersteEingabe, zweiteEingabe, ausgabe; int zahl1, zahl2; ersteEingabe = JOptionPane.showInputDialog("Geben Sie die erste ganze Zahl ein"); zweiteEingabe = JOptionPane.showInputDialog("Geben Sie die zweite ganze Zahl ein"); zahl1 = Integer.parseInt(ersteEingabe); g p g zahl2 = Integer.parseInt(zweiteEingabe); //Initialisierung von ausgabe als leerer String: ausgabe = ""; Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 184 //Bestimmung des Ausgabestrings if (zahl1 == zahl2){ ausgabe = ausgabe + zahl1 + " == " + zahl2; } if (zahl1 != zahl2){ ausgabe = ausgabe + "\n" + zahl1 + " != " + zahl2; } if (zahl1 < zahl2){ ausgabe = ausgabe + "\n" + zahl1 + " < " + zahl2; } if (zahl1 > zahl2){ ausgabe = ausgabe + "\n" + zahl1 + " > " + zahl2; } if (zahl1 <= zahl2){ ausgabe = ausgabe + "\n" + zahl1 + " <= < " + zahl2; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 185 if (zahl1 >= zahl2){ ausgabe = ausgabe + "\n" + zahl1 + " >= " + zahl2; } if (ersteEingabe.equals(zweiteEingabe)){ ausgabe = ausgabe + "\n" + ersteEingabe + " ist gleich " + zweiteEingabe; }else{ ausgabe += "\n" + ersteEingabe + " ist nicht gleich " + zweiteEingabe; } JOptionPane.showMessageDialog(null, ausgabe); System.exit ( 0 ); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 186 Bemerkung • Jede lokale Variable, d. h. eine Variable innerhalb einer Methode muss vor der Verwendung initialisiert werden. (Im Beispiel ausgabe = "";) • Werden lokale Variablen verwendet verwendet, bevor sie initialisiert wurden, wurden so erzeugt der Compiler eine Fehlermeldung Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 187 Geschachtelte if- und else- Anweisungen if- Anweisungen können auch geschachtelt werden. Ein else-Zweig gehört dabei immer zu dem letzten if, für das noch kein elseZweig existiert. Beispiel: if (n < = 5) if (a > b) z = a; else z = b; Soll eine andere Zugehörigkeit dargestellt werden, so müssen geschweifte Klammern gesetzt werden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 188 Die Selektion: Mehrfache Alternative – else if else if Anweisungen bieten die Möglichkeit, eine Auswahl unter verschiedenen Alternativen zu treffen. Die Syntax in JAVA lautet if (Bedingung 1) Anweisung 1; //Block //Bl k oder d Ei Einzelanweisung l i else if (Bedingung 2) Anweisung2; else if (Bedingung n) Anweisung n; else //der else-Zweig ist optional Anweisung m; Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 189 //Alternative Bestimmung des Ausgabestrings if ((zahl1 <= ausgabe = ausgabe = ausgabe = zahl2) && ausgabe + ausgabe + ausgabe + (zahl1 != zahl2)){ zahl1 + " < " + zahl2; "\n" + zahl1 + " <= " + zahl2; "\n" + zahl1 + " != " + zahl2; }else if (zahl1 == zahl2){ ausgabe = ausgabe + "\n" + zahl1 + " == " + zahl2; ausgabe = ausgabe + "\n" + zahl1 + " <= " + zahl2; ausgabe = ausgabe + "\n" + zahl1 + " >= " + zahl2; }else { ausgabe = ausgabe + "\n" + zahl1 + " > " + zahl2; ausgabe = ausgabe + "\n" + zahl1 + " >= " + zahl2; ausgabe = ausgabe + "\n" + zahl1 + " != " + zahl2; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 190 Ein weiteres Beispiel: Liegt bei einer einzugebenden Jahreszahl ein Schaltjahr vor? Eine Jahr ist ein Schaltjahr, wenn die Jahreszahl durch 400 teilbar ist oder – falls nein- wenn sie nicht durch 100 teilbar ist und gleichzeitig aber durch 4 teilbar ist. import javax.swing.JOptionPane; class Schaltjahr{ public static void main (String args[]){ String eingabe, ausgabe; boolean schaltj; int jzahl; eingabe = JOptionPane.showInputDialog("Geben Sie ein Jahr > 1583 ein"); //Konvertierung der Eingabe von String nach int: jzahl = Integer.parseInt(eingabe); Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 191 //Fallunterscheidung if (jzahl % 400 == 0) schaltj = true; else if (jzahl % 100 == 0) schaltj = false; else if (jzahl j % 4 == 0) schaltj = true; else schaltj = false; if (schaltj) ausgabe = eingabe + " ist ein Schaltjahr"; else ausgabe = eingabe + " ist kein Schaltjahr"; JOptionPane.showMessageDialog(null,ausgabe); System.exit ( 0 ); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 192 Die Selektion: Mehrfache Alternative – switch Die switch-Anweisung dient zur Selektion unter mehreren Alternativen (vgl. else if-Anweisung). Die Syntax in JAVA lautet switch (Ausdruck){ case konst1: Anweisungen 1; break; case //ist optional konst2: Anweisungen 2; break; //ist optional …… default : Anweisungen default; //ist optional } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 193 Bemerkung zur switch-Anweisung • Der Ausdruck nach switch muss vom Datentyp byte, char, short oder int sein. • Nach case darf jeweils nur eine Konstante stehen. • Nach case muss eine Konstante stehen, die bereits bei der Übersetzung des Programms berechnet werden konnte. • Wenn es keine passende Konstante gibt, wird der Programmablauf bei der default- Anweisung fortgesetzt, falls diese vorhanden ist. • Die break-Anweisung b k Anweisung ist von der Syntax her nicht erforderlich erforderlich, sollte aber stets gesetzt werden. • Ohne die break-Anweisung werden nach einer Übereinstimmung alle weiteren Anweisungen ausgeführt Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 194 Beispiel für eine switch Anweisung Sei monat eine Integer-Variable: switch (monat){ case 4: tage = 30; break; case 6: tage = 30; break; case 9: tage = 30; break; case 11:tage = 30; break; case 2: tage = 28; break; default:tage = 31; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 195 oder (mit identischem Ergebnis) switch (monat){ case 4: case 6: case 9: case 11: tage = 30; break; case 2: tage = 28; break; default: tage = 31; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 196 Die Wiederholung oder Schleife • Schleifen dienen dazu, eine bestimmte Abfolge von Anweisungen (Schleifenrumpf) wiederholt auszuführen. Die Anweisungen werden ausgeführt, so lange eine bestimmte Bedingung (Schleifenbedingung) erfüllt ist. • Eine Schleife wiederholt eine Anweisung bzw. eine Sequenz. • Dabei unterscheidet man Schleifen, bei denen die Schleifenbedingung am Anfang geprüft wird, und Schleifen, bei denen diese Prüfung am Ende erfolgt. g Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 197 Schleifen mit Vorabprüfung (Abweisende Schleifen) while-Schleife • In einer while-Schleife kann eine Anweisung oder ein Anweisungsblock in Abhängigkeit gg von der Bewertung g der Bedingung g g wiederholt ausgeführt g werden. Da die Bedingung vor der Ausführung der Anweisungen bewertet wird, spricht man auch von einer abweisenden Schleife. • Die Bedingung wird berechnet und die Anweisungen dann ausgeführt, wenn der Ausdruck true ist. • Danach wird die Berechnung der Bedingung und die eventuelle Ausführung der Anweisungen wiederholt. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 198 Das Struktogramm für die while-Schleife while Bedingung Anweisung 1 Anweisung n Die Syntax in JAVA für eine while-Schleife lautet: while (Bedingung){ Anweisung 1;....;Anweisung n; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 199 Bemerkung • Besteht der Schleifenrumpf nur aus einer Anweisung, so können die geschweiften Klammern {} weggelassen werden. • Um keine Endlos-Schleife zu erzeugen, erzeugen muss die Schleifenbedingung durch eine Anweisung manipuliert werden. Beispiel while (i < 10){ ..... i = i + 1; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 200 // Durchschnitt.java /*Berechnet den Durchschnitt von x einzugebenden Zahlen. Die Anzahl x wird eingelesen */ import javax.swing.JOptionPane; class Durchschnitt{ public static void main (String args[]){ String eingabe, anzahl1, ausgabe; int anzahl; double durchschnitt; int zahl = 0, zaehler = 1, gesamtsumme = 0; //Einlesen der Anzahl der einzugebenden Zahlen als String: anzahl1 = JOptionPane.showInputDialog("Geben Sie die Anzahl der einzugebenden Zahlen ein"); anzahl = Integer.parseInt (anzahl1); Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 201 while (zaehler <= anzahl){ eingabe = JOptionPane.showInputDialog("Geben Sie die " + zaehler +". Zahl ein"); //Konvertierung der Eingabe von String nach int: zahl = Integer.parseInt(eingabe); // Addition der Zahl zur Gesamtsumme gesamtsumme = gesamtsumme + zahl; // Zaehler um 1 erhöhen ++zaehler; } //Berechnung des Durchschnitts durchschnitt = (double) gesamtsumme / anzahl; //Ausgabe g JOptionPane.showMessageDialog(null, "Durchschnitt:"+durchschnitt); System.exit ( 0 ); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 202 Abweisende Schleife mit for Die Syntax in JAVA für eine for-Schleife lautet: for ( Initialisierer ; Bedingung ; Aktualisierung){ Anweisung 1;....;Anweisung n; } B i i l Beispiel: for (int i = 1; i <= 10; i++) System.out.println (i); Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 203 Bemerkung zur for-Schleife • Die for-Schleife ist eine abweisende Schleife, da zuerst geprüft wird, ob die Bedingung für ihre Ausführung zutrifft. • Die for-Schleife ist eine spezielle p Variante der while-Schleife. Sie wird typischerweise zum Zählen benutzt. • Zu Beginn der Schleife wird einmalig die Initialisierung durchgeführt. Hierdurch wird die lokale Variable, die in der Regel als Laufvariable verwendet wird, definiert und initialisiert. Sie ist nach Beendigung der forSchleife ungültig ungültig. • Die Schleifenbedingung wird vor dem Durchlaufen des Schleifenrumpfes, d. h. vor jedem Schleifeneintritt, getestet. Ergibt der Ausdruck false, wird die Schleife nicht durchlaufen und beendet. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 204 • Die Aktualisierung, d. h. die Veränderung der Laufvariablen, wird am Ende jedes Schleifendurchlaufs, aber noch vor dem nächsten Schleifeneintritt ausgeführt. • Im ersten und letzten Teil einer for-Schleife können Kommata eingesetzt werden. Damit lassen sich entweder mehrere Variablen deklarieren oder mehrere Ausdrücke nebeneinander schreiben. Beispiel: for (int i = 1, j = 9; i <= j; i++, j--) System.out.println i l (i + "*" + j + " = " + i*j); i*j) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 205 Zwei Beispiele zur for-Schleife Beispiel 1 // Addierer.java /* Addiert alle ungeraden Zahlen zwischen 1 und 50 */ class Addierer{ public static void main (String args[]){ int summe = 0; for (int i = 1; i <= 50; i = i+2){ summe = summe + i; } System.out.println (summe); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 206 Beispiel 2 // GeschachtelteSchleife.java /* Beispiel für das Schachteln von 2 for-Schleifen */ class GeschachtelteSchleife { public static void main (String for (int i = 1; i <= 10; for (int j = 2; j <= 5 ; System.out.print (i*j args[]){ i++){ j++) + "\t"); System.out.println (); } } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 207 • Die for-Schleife ist äquivalent mit { Initialisierer; while (Bedingung){ Anweisung 1;…;Anweisung n; Aktualisierung; } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 208 Die in der Applikation Durchschnitt.java benutzte while-Schleife kann durch folgende for-Schleife ersetzt werden: for (int i = 1; i<= anzahl; i++){ eingabe = JOptionPane.showInputDialog("Geben Sie die " + i +". Zahl ein"); //Konvertierung der Eingabe von String nach int: zahl = Integer.parseInt(eingabe); // Addition der Zahl zur Gesamtsumme gesamtsumme = gesamtsumme + zahl; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 209 Ein weiteres Beispiel für abweisende Schleifen Die Applikation Ggt.java soll den größten gemeinsamen Teiler von zwei positiven ganzen Zahlen berechnen. Die beiden Zahlen sollen eingegeben werden. Falls eine der beiden Zahlen nicht positiv ist, soll eine Fehlermeldung ausgegeben werden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 210 // Ggt.java /*Berechnet den groessten gemeinsamen Teiler von zwei positiven integer Zahlen */ import javax.swing.JOptionPane; class Ggt{ public static void main (String args[]){ String ersteEingabe, zweiteEingabe, ausgabe; int zahl1, zahl2, hilf; ersteEingabe = JOptionPane.showInputDialog("Geben Sie die erste positive ganze Zahl ein"); zweiteEingabe =JOptionPane.showInputDialog("Geben Sie die zweite positive ganze Zahl ein"); zahl1 = Integer.parseInt (ersteEingabe); zahl2 = Integer.parseInt (zweiteEingabe); Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 211 //Sind beide Zahlen positiv? if (zahl1 <=0 || zahl2 <= 0){ JOptionPane.showMessageDialog(null,"Die Zahlen muessen positiv sein!","Fehler",JOptionPane.ERROR_MESSAGE); System.exit (0); } while (zahl2 > 0){ //Vertausch zahl1 und zahl2 hilf = zahl1; zahl1 = zahl2; zahl2 = hilf; zahl2 = zahl2 % zahl1; } //Ausgabe JOptionPane.showMessageDialog(null, "ggt von „ +ersteEingabe+" und "+zweiteEingabe+" ist "+zahl1); System.exit ( 0 ); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 212 Die Ausgabe der Applikation Ggt.java sieht wie folgt aus: oder falls eine Zahl nicht echt positiv ist: Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 213 Schleife Prüfung am Ende (Annehmende Schleife) do while-Schleife Die Syntax in JAVA lautet do { Anweisung 1;…;Anweisung n; } while ( Bedingung); Struktogramm der do while Schleife: Anweisung 1 Anweisung n while Bedingung Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 214 Bemerkung zur do while Schleife • Die do while-Schleife ist eine annehmende Schleife, da die Schleifenbedingung erst nach jedem Schleifendurchgang geprüft wird. • p schon einmal durchlaufen. Bevor es zum ersten Test kommt,, ist der Rumpf • Achtung: Nach while (Bedingung); muss ein Semikolon gesetzt werden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 215 //BinaerUmwandler.java /* Umwandlung einer ganzen Zahl in eine binäre Zahl */ import javax.swing.JOptionPane; class BinaerUmwandler{ public static void main (String args[]){ String eingabe; eingabe = JOptionPane.showInputDialog (null, "Geben Sie eine ganze Zahl ein, die umgewandelt werden soll"); int zahl = Integer.parseInt(eingabe); //Initialisierung String binaer = ""; int rest; Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 216 do { rest = zahl % 2; zahl = zahl / 2; //Zusammensetzung des Strings zur Binaerdarstellung binaer = rest + binaer; } while (zahl > 0); JOptionPane.showMessageDialog(null,"Die ganze Zahl "+ eingabe +" hat die binaere Darstellung "+binaer); System.exit( 0 ); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 217 Die Endlosschleifen Sind die Bedingungen von Schleifen immer wahr, so handelt es sich um Endlosschleifen. Beispiele while-Schleife while (true) ; oder while ( 0 == 0){ // immer wieder und immer wieder } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 218 Beispiel für eine Endlosschleife mit for Alle drei Ausdrücke im Kopf der Schleife sind bei einer for Schleife optional. Damit ist die einfachste Endlosschleife gegeben durch f for ( ; ) (; ; Die Semikolons sowohl im Schleifenkopf als auch im Schleifenrumpf müssen stets gesetzt werden. Beispiel für eine Endlosschleife mit do while do ; while (true); Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 219 Ausstieg aus Schleifen • Die Schlüsselwörter break und continue ermöglichen es, Anweisungsblöcke zu verlassen bzw. wieder einzusteigen. • Wird innerhalb einer for-, while- oder do/while Schleife eine breakAnweisung gesetzt, so wird der Schleifendurchlauf beendet. • break beendet immer die innerste Schleife Beispiel for (int i = 1; i < 1000;i++){ System.out.println(i); y p if (i > 5) break; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 220 Ausstieg aus beliebig tief geschachtelten Schleifen • Zum Ausstieg aus beliebig tief geschachtelten Schleifen wird ein so genanntes Label benutzt, um anzuzeigen, wohin der Sprung gehen soll. • Ein Label besteht aus einem JAVA-Bezeichner, an den ein Doppelpunkt gehängt wird. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 221 Bemerkung zum Einsatz eines Labels • Das Label gibt der Schleife einen Namen (im Beispiel TestSchleife) • Die break-Anweisung springt hinter die Schleife, die den Namen des Labels trägt. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 222 Beispiel für ein Schleifenausstieg mit Label class BreakMitLabel{ public static void main (String args[]){ TestSchleife: for (int i = 1; i < 10;i++){ f for (i t j = 1 (int 1; j < 10 10;j++){ j++){ System.out.println (i + j); if ( j > 5) break TestSchleife; } } } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 223 Noch ein Beispiel für ein Schleifenausstieg mit Label class BreakMitLabel2{ public static void main (String args[]){ TestSchleife: for (int i = 1; i < 3;i++){ N hEi L b l NochEinLabel: for (int j = 1; j < 10;j++){ System.out.println (i + j); if ( j > 2) break NochEinLabel; } } } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 224 Das Schlüsselwort continue Im Gegensatz zu break beendet continue die Schleife nicht, sondern überspringt die restlichen Anweisungen innerhalb der Schleife, um den nächsten Durchgang zu starten. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 225 Beispiel für den Einsatz von continue class BeispielMitContinue{ public static void main (String args[]){ int zahl = 12; while (zahl > 0){ zahl--; hl if (zahl % 3 == 0) continue; System.out.println ("zahl = " + zahl); } } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 226 Die Applikation BeispielMitContinue liefert die Ausgabe Bemerkung: Die continue-Anweisungen können wie das break mit einem Label ergänzt werden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 227 Arrays • Ein Array ist eine grundlegende Datenstruktur. • Ein Array ist ein Objekt. • Unter einem Arrayy (Feld) ( ) versteht man eine Anordnung g von Elementen desselben Datentyps. • Die einzelnen Elemente heißen Komponenten und können über Indizes angesprochen werden. • In JAVA beginnen die Indizes eines Arrays stets mit 0. • Der Zugriff g auf die i-te Komponente p des Arrays y mit dem Namen arrayName y erfolgt durch arrayName[i-1]. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 228 Arrays werden in drei Schritten erstellt a. Deklaration der Arrayvariablen b. Zuweisung von Speicher für die Komponenten des Arrays c. Initialisierung der Komponenten zu a. Durch die Deklaration einer Arrayvariablen wird eine Variable definiert, die auf ein Array-Objekt zeigen kann. Die Variable ist also eine Speicheradresse, die zunächst den Wert null (d. (d h h. keinen Wert) hat. hat Da es sich um einen Zeiger handelt, bezeichnet man Arrayvariablen als Referenzvariablen. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 229 zu a. Die allgemeine Form der Definition einer Referenzvariablen auf ein eindimensionales Array ist: Typname[] arrayName; oder Typname arrayName []; Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 230 zu b: Mit dem new-Operator kann das konkrete Array erzeugt werden. Beispiel: arrayName y = new byte y [ [4] ] legt g ein Array-Objekt y j mit 4 Komponenten p an. Diese Komponenten werden mit dem Wert binär 0 belegt (d. h. z. B. bei Zahlen wie int mit Wert 0, boolean mit false, char mit null und Objekte mit null). Es wird jetzt 4 mal so viel Speicher reserviert, wie der Datentyp des Arrays für die Speicherung von einem Element benötigt. zu c: Durch Zuweisung von Werten an die Komponenten können die Default-Werte mit sinnvollen Werten überschrieben werden, z. B. arrayName[0] = 3; Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 231 zu a,b,c: Implizites Erzeugen über eine Initialisierungsliste Eine andere Möglichkeit, ein Array anzulegen, ist, das Array implizit über eine Initialisierungsliste zu erzeugen und gleichzeitig zu initialisieren. p byte[] y [] arrayName y = { {1,2,3,4} , , , } Beispiel: Das Erzeugen des Array-Objektes wird hier vom Compiler im Verborgenen durchgeführt. Die Definition der Referenzvariablen arrayName, das Anlegen des Arrays, sowie die Initialisierung der Array-Elemente erfolgt in einem Schritt. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 232 Bemerkung zu Arrays • Arrays kann man von einem beliebigen Datentyp oder einer beliebigen Klasse erstellen. Dies können primitive Datentypen, Objekte oder andere Arrays sein. Im letzteren Fall spricht man dann von mehrdimensionalen Arrays. y • Die Größe eines Arrays wird zum Zeitpunkt der Erstellung des Arrays festgelegt, danach kann sie nicht mehr verändert werden. • Mit Hilfe der Eigenschaft length kann man die Anzahl der Komponenten des Arrays erhalten. (siehe temperatur.length im Programm-Beispiel) • JAVA erlaubt l bt einen i Z Zugriff iff ausschließlich hli ßli h auff solche l h El Elemente t eines i A Arrays, die auch tatsächlich vorhanden sind. Bei jedem Zugriff auf ein Array wird der angegebene Index mit den in der Array-Deklaration angegebenen Grenzen verglichen. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 233 Beispiele für das Erzeugen von Arrays /* a /* b /* c */ */ */ int feld[]; feld = new int [8]; for (int i = 0; i < feld.length; i++) feld[i] = i i*i; i; oder /* a */ /* b,c */ int feld[]; feld = new int[] {0,1,4,9,16,25,36,49}; oder /* a,b,c */ int feld[] = {0,1,4,9,16,25,36,49}; Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 234 // TemperaturJan.java //Initialisierung und Ausgabe eines Arrays class TemperaturJan{ public static void main (String args[]){ final int ANZAHL_TAGE = 31; String ausgabe; double temperatur[] = new double [ANZAHL_TAGE]; //Initialisierung mit Durchschnittswerten; for (int i = 0; i < temperatur.length;i++) temperatur [i] = 5.3; //Ausgabe der Arraywerte ausgabe = "Tag\tTemperatur\n"; for (int i = 0; i < temperatur.length;i++) ausgabe += i+ "\t" + temperatur [i] + "\n"; System.out.println (ausgabe); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 235 Konstanten in JAVA • Das Schlüsselwort final (siehe Beispiel TemperaturJan) indiziert, dass die deklarierte Variable (ANZAHL_TAGE) eine Konstante ist. Sie wird bei ihrer Deklaration initialisiert und kann danach nicht wieder verändert werden. • Manchmal werden Konstanten auch als „read-only“ Variablen bezeichnet. • Der Versuch, eine final-Variable zu verändern, resultiert in einer Fehlermeldung des Compilers. • Konstanten werden durchgängig in Großbuchstaben geschrieben. Unterstriche sind hier erlaubt. erlaubt Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 236 Methoden Eine Methode ist ein Block von Anweisungen, der gewisse Eingabeparameter als Input benötigt und nach Ausführungen der Anweisungen einen Wert zurück gibt. Dabei kann die Menge der Eingabeparameter oder die Rückgabe auch leer sein. sein Eine Methode besteht aus vier Teilen (ein Konstruktor nur aus drei, s. später): Dem Rückgabetyp, dem Methodennamen, der Eingabe- bzw. Parameterliste und dem Methodenrumpf. Der Rückgabetyp gibt den Datentyp des zurückgegebenen Wertes an. Der Methodenname legt den Namen der Methoden fest. Der Methodenrumpf besteht aus einzelnen Anweisungen, die von geschweiften Klammern { } umschlossen werden, d. h. einen Block bilden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 237 Damit hat eine Methode folgende Gestalt Rückgabetyp methodenName (Parameterliste){ Anweisung 1; ……. ; Anweisung m; Methodenrumpf } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 238 Die Eigenschaften der Parameterliste • Sie besteht aus endlich vielen Parametern, die von runden Klammern umschlossen werden. • Die Parameterliste kann auch leer sein. Man muss dennoch die runden Klammern hinter dem Methodennamen setzen, d. h. methodenName() • Parameter können beliebige Daten sein (z. B. Zahlenwert, Strings, Objekte). Parameter werden wie Variablen definiert, d. h. erst der Datentyp, dann der Name. Jeder Parameter muss einzeln definiert werden,, die Parameter werden durch Kommata getrennt. • Wichtig: Die Reihenfolge der Parameter in der Methodendeklaration ist bindend festgelegt. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 239 Methodendeklaration – der Rückgabetyp Man unterscheidet zwei Arten von Methoden: Methoden ohne Rückgabewert und Methoden mit Rückgabewert. Wie Variablen müssen Methoden auch deklariert werden: Die Syntax einer Methode mit Rückgabe Datentyp des Rückgabewertes methodenName (Datentyp p1,…,Datentyp pn){ …….; return Rückgabewert; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 240 Methode ohne Rückgabe void methodenName (Datentyp p1,…,Datentyp pn){ …….; } • Das reservierte Wort void gibt an, dass die Methode keinen Rückgabewert liefert liefert. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 241 Bekannte Beispiele für Methoden • Methode showMessageDialog() der Klasse JOptionPane liefert void • Methode showInputDialog() der Klasse JOptionPane liefert String • Methode parseInt() der Klasse Integer liefert int • Methode main()liefert void Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 242 Anmerkungen zu Methoden • Methoden müssen stets vollständig in der Klasse angegeben werden, der sie angehören. • Es gibt keine Methoden außerhalb von Klassen. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 243 Der Aufruf einer Methode Der Aufruf erfolgt durch die Angabe des Namens der Methode mit Angaben der Eingabeparameter. Beispiele: Integer.parseInt (ersteEingabe); JOptionPane.showMessageDialog(null,"Die Zahlen muessen positiv sein!","Fehler",JOptionPane.ERROR p , , p _MESSAGE); ); Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 244 Statische Methoden Es werden zwei Arten von Methoden unterschieden. Dies sind die Instanzmethoden (objektgebundene Methoden) und die Klassenmethoden. Hier beschäftigen wir uns zunächst mit den Klassenmethoden. Klassenmethoden oder statische Methoden sind eine spezielle Art von Methoden, die kein Objekt benötigen (die Bedeutung von Objekte werden wir später behandeln). Eine statische Methode wird unter Angabe des Namens derjenigen Klasse, in der sie deklariert ist, aufgerufen, d. h. Klassenname.Methodenname (…); Der Klassenname kann auch weggelassen werden, wenn die Methode in derselben Klasse deklariert ist. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 245 Deklaration von statischen Methoden Deklariert wird eine statische Methode, indem man vor dem Rückgabetyp das reservierte Wort static schreibt. Statische Methode mit und ohne Rückgabe static Datentyp des Rückgabewertes methodenName (Datentyp p1,…,Datentyp pn){ …….; return Rückgabewert; } static void methodenName (Datentyp p1,…,Datentyp pn){ …….; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 246 Beispiele für den Einsatz von statischen Methoden class MaximumBestimmung { static int maximum (int x, int y){ if (x > y) return x; else return y; } public static void main (String args[]) { int a = 3, b = 10; int m; m = maximum(a,b); i ( b) System.out.println("Maximum ist "+m); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 247 Ein weiteres Beispiel für die Verwendung von Klassenmethoden // Rechteck.java /*Liest die Seitenlaengen eines Rechtecks ein und ermittelt Flaecheninhalt und Laenge der Diagonale */ import javax.swing.JOptionPane; class Rechteck { static double liesSeite() { String eingabe; double zahl; eingabe =JOptionPane.showInputDialog("Geben Sie eine Seitenlaenge des Rechtecks ein:"); zahl = Double.parseDouble (eingabe); return zahl; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 248 static double inhalt (double x, double y){ double i; i = x*y; return i; } static double diagonale (double x, double y){ double d; d = Math.sqrt(x*x + y*y); return d; } public static void main (String args[]) { double a, b, c , d; a = liesSeite(); b = liesSeite(); c = diagonale(a,b); di l ( b) d= inhalt(a,b); String ausgabe = "Flaecheninhalt: " + d +"\nDiagonale: "+c; JOptionPane.showMessageDialog(null,ausgabe); System.exit (0); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 249 Bemerkung: Die Deklaration static Nicht nur Methoden können static sein. Sollen Attribute oder Methoden für alle Objekte der Klasse zugänglich sein, so werden sie als static deklariert. Man spricht p dann von Klassenvariablen bzw. Klassenmethoden. Meist werden Methoden als static deklariert, um sie anderen Klassen zur Verfügung zu stellen, ohne Objekte der betreffenden Klassen zu erzeugen, z. B. Methode sqrt() aus der Klasse Math. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 250 Methoden der Klasse Math • Für die arithmetischen und trigonometrischen Standardfunktionen hat JAVA eine spezielle Klasse, die Klasse Math. • Math M th gehört zum Paket java.lang, j l dem einzigen Paket Paket, das automatische in jedes Programm importiert wird. • Math-Methoden können damit jederzeit genutzt werden. • Alle Math-Methoden sind static. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 251 Einige Methoden der Klasse Math • abs: Liefert den Betrag einer Zahl double abs (double a) float abs (float a) int abs (int a) long abs (long a) • acos, asin, atan: Liefern den arc cosinus, arc sinus, arc tan eines Winkels double acos (double a) double asin (double a) double atan (double a) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 252 • cos, sin, tan: Trigonometrische Funktionen, in Bogenmaß double cos (double a) double sin(double a) double tan(double a) • exp: Liefert die Eulersche Zahl e hoch einen double Wert double exp (double a) • log: Liefert den natürlichen Logarithmus (d. h. zur Basis e) von einem double-Wert double log (double a) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 253 • max, min: Liefert Maximum bzw. Minimum zweier Zahlen double max (double a, double b) float max(float a, float b) int max(int a, int b) long max (long a, long b) double min (double a, double b) float min(float a, float b) int min(int a, int b) long min (long a, long b) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 254 • pow: Liefert den Wert des ersten Arguments potenziert mit dem zweiten Argument double pow (double a, double b) • random: Liefert einen positiven Zufalls- double-Wert größer gleich 0.0 und kleiner 1.0 double random() • round: Runden auf ganze Zahlen long round (double a) int round (float a) • sqrt: Liefert die Wurzel double sqrt (double a) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 255 Runden von Zahlen • Die Methode round() der Klasse Math rundet Zahlen. • round() rundet auf die nächste Ganzzahl vom Typ long (kaufmännisches Runden). Runden) Beispiel: double a = 97.56; // ergibt Math.round(a) = 98; • Mit Hilfe von round() können auch auf Nachkomma-Stellen gerundet werden. • Beispiel: Runden auf 2 Nachkommastellen Math round(a*100)/100 liefert für a = 1.3456 Math.round(a*100)/100. 1 3456 den Wert 1.35 1 35 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 256 Überladen von Methoden Eine Methode ist gekennzeichnet durch Rückgabewert, Name und Parameterliste. Eine überladene Methode ist eine Methode mit gleichem Namen wie eine andere Methode, aber mit einer anderen Parameterliste. Es gibt zwei Arten: • Eine Methode kann die gleiche Anzahl von Parametern wie eine andere besitzen und unterschiedliche, aber für den Compiler unterscheidbare, Typen annehmen • Die e Anzahl a de der Parameter a a ete kann a unterschiedlich u te sc ed c sein. se Beispiel die Methode min() aus der Klasse Math. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 257 Grundlagen der Objektorientierung Ziel der objektorientierten Programmierung (OOP) ist die mehrfache Verwendung von Programmcode. Die Grundidee der OOP ist der Ansatz Ansatz, dass Programme die Welt oder Teile der Welt abbilden. Die Welt besteht aus Objekten. Das sind • Gegenstände (Autos, Flugzeuge, Schiffe…) • Lebewesen (Menschen, Tiere, Pflanzen…) • abstrakte Konstrukte (Staaten, Konzerne, Konten…) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 258 Für diese Objekte gilt • Sie können in Kategorien bzw. Klassen -d. h. in sinnvolle Einheitenzusammengefasst werden. Beispiel: Tiere, Pflanzen, Wirbeltiere, Säugetiere, Fische gehören alle zur Klasse der Lebewesen. • Jedes Objekt hat individuelle Eigenschaften (ein Objekt „Person“ hat einen Namen, ein Objekt „Auto“ eine Marke…) • Objekte erfahren Prozesse oder führen sie selber aus (ein Mensch wird geboren, der Kontostand von Person A verringert sich…) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 259 Die Theorie der Objektorientierung fasst dies zu einem Konzept zusammen. In der Objektorientierung werden die folgenden Bezeichnungen verwendet: Klassen Eigenschaften Attribute Kategorien Prozesse Methoden Klasse attribute methoden() Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 260 Klassen und Objekte • Eine Klasse ist ein Schema, eine Schablone, eine Kategorie, in die bestimmte individuelle Objekte eingeordnet werden können. • j zu einer Klasse,, g gelten alle Eigenschaften g der Klasse. Gehört ein Objekt • Ein Objekt ist immer eine konkrete Ausprägung einer Klasse, man sagt: • • Ein Objekt ist eine Instanz seiner Klasse. Die Klasse ist der zentrale Begriff aus Sicht der objektorientierten Programmierung. • Ein Objekt ist eindeutig bestimmt durch seine Attribute (Daten, Eigenschaften) und durch seine Methoden (Funktionen, Verhalten). Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 261 • Wie man von einem Konstruktionsplan für ein Auto mehrere Fahrzeuge von diesem Typ bauen kann, so kann man auch von einer Klasse mehrere Objekte „bauen“. • So wie die Autos in unterschiedlichen Farben, Motoren und Ausstattungen gebaut werden, so können auch von Klassen die Objekte mit verschiedenen Eigenschaften erstellt werden. • Aus der Weltanschauung könnte dann der Hersteller dem Paket, die Werksabteilung der Klasse, die Materialien den Attributen, die Maschinen den Methoden und der Konstruktionsplan dem Konstruktor in JAVA entsprechen. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 262 • Eine einfache Anwendung für eine Klasse ist das Zusammenfassen zusammengehöriger Variablen. String ist eine Klasse, die aus einem Array aus char-Variablen besteht. Nach der Erzeugung des Strings, d. h. nach dem Anlegen der Instanz bzw. des Objektes Objektes, besteht der String aus zusammengehörigen Buchstaben Buchstaben, die zu einem Wort zusammengefasst sind. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 263 Kapselung Ein wesentliches Konzept der Objektorientierung ist, dass die Attribute von den Methoden vor der Außenwelt gekapselt sind. Sie können (im allgemeinen) nur durch die Methoden verändert werden. Die Methoden eines Objektes sind die Schnittstellen des Objektes zur Außenwelt. Es bedeutet, dass der Anwender nur über diese Schnittstellen auf die Attribute und Methoden einer Klasse zugreifen kann. Attribute Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 264 Generalisierung und Vererbung • Einzelne Klassen können zu weiteren Klassen zusammengefasst werden. Z. B. können die Klasse der Autos, die Klasse der Flugzeuge und die Klasse der Schiffe zur Klasse der Fortbewegungsmittel zusammengefasst werden werden. Man sagt, dass die einzelnen Klassen generalisiert bzw. verallgemeinert werden. • Die allgemeine Klasse heißt Superklasse, Oberklasse oder Mutterklasse. • Die speziellen Klassen heißen Subklassen, Unterklassen oder Kindklassen. • Eine Superklasse hat eine besondere Beziehung zu ihrer Subklasse (oder ihren Subklassen), eine „Ist-ein“-Beziehung (‚is-a‘ relation) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 265 • Alle Attribute und Methoden der Superklasse sind gleichzeitig Attribute und Methoden jeder ihrer Subklassen. • Man sagt, dass ein Objekt einer Subklasse die Attribute und Methoden der Superklasse erbt erbt. Die Attribut und Methoden sind dann für die Subklasse sichtbar. • Dieses Prinzip nennt man Vererbung. • Für Subklassen spezifische Attribute und Methoden können nicht geerbt werden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 266 UML • UML (Unified Modelling Language) ist eine Sprache zur visuellen Modellierung von Strukturen und Prozessen von Software. • Sie ist Standard der modernen Software-Entwicklung Software Entwicklung • Eines der Diagramme der UML ist das Klassendiagramm • Jede Klasse wird als ein Rechteck dargestellt, mit dem Namen der Klasse im oberen Teil, allen Daten (Attributen) im mittleren Teil und den Methoden im unteren Teil. • Oft wird in der UML einer der beiden unteren Teile weggelassen, wenn sie für die jeweilige Betrachtung nicht interessant sind. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 267 Einige Darstellungsformen aus UML Klasse Objekt Klasse :Klasse attribute attribute methoden() th d () methoden() th d () Vererbung SubKlasse SuperKlasse Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 268 Ein erstes Beispiel für eine Klasse Gegeben sei ein Punkt im Koordinatensystem mit einer x- und einer yKoordinate. Damit hat ein jeder Punkt die Eigenschaften (Attribute) double y; double x Jeder Punkt hat auch Methoden, dies sind Methoden, die die Koordinaten x und y setzen und Methoden, die die Koordinaten eines Punktes auslesen. Natürlich sind auch noch andere Methoden möglich. Damit hat die Klasse Punkt die Form Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 269 Die Syntax für eine Klasse lautet class Klassenname{ Deklaration der Attribute; Deklaration der Methoden; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 270 class Punkt { double x; double y; double getX(){ return x; } //Attribut //Attribut //get-Methode double getY(){ return y; } //get-Methode void setX(double i){ x = i; } //set-Methode void setY(double j){ y = j; } //set-Methode } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 271 Erzeugen eines Objektes, d. h. einer Instanz einer Klasse Als nächstes wird ein Objekt von der Klasse Punkt erzeugt. Dies erfolgt innerhalb der Klasse PunktApp in der main-Methode. class PunktApp{ public static void main (String args[]) { Punkt p; //Deklaration der Variable p = new Punkt(); //Erzeugung des Objektes p.setX(3.7); p.setY(4.0); System out println("Koordinaten System.out.println( Koordinaten des Punktes sind: ("+p.getX() +","+ p.getY()+")"); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 272 Der new-Operator • Die Erzeugung eines Objektes geschieht mit dem new-Operator und der Zuordnung der Variablen: KlassenName variable = new KlassenName(); (*) • Der new-Operator erzeugt bzw. instanziiert ein Objekt. • Nach dem new-Operator erscheint eine spezielle Methode, der so genannte Konstruktor. Er trägt den Namen der Klasse des erzeugten Objekts und initialisiert die Attribute. Dem Konstruktor können Parameter übergeben werden –oder wie hierkann die Parameterliste leer sein. In diesem Fall spricht man von einem Standardkonstruktor. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 273 • Die Zeile (*) kann auch in zwei Zeilen geschrieben werden: Deklaration der variable durch Klassenname variable; hierdurch wird Speicherplatz reserviert. Erzeugung g g des Objektes j mit dem new-Operator, p , d. h. variable = new KlassenName(); Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 274 Zugriff auf die Methoden und Attribute des Objektes • Wurde ein Objekt p erzeugt, so kann durch p.Attribut auf die Attribute zugegriffen bzw. durch p.methode() die Methoden des Objektes verwendet werden Im Beispiel PunktApp werden. P ktA wurde z. z B. B durch p.setX(3.7); tX(3 7) die Methode setX() des Objektes p aufgerufen. • Bemerkung: Im Allgemeinen ist es nicht erlaubt, direkt auf Attribute zuzugreifen. Auch der Zugriff auf Methoden kann beschränkt sein. Dies wird näher im Kapitel: „Öffentlichkeit Öffentlichkeit und Privatsphäre“ Privatsphäre behandelt. behandelt Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 275 Lokale Variablen und Attribute • Ein Aufrufparameter einer Methode hat einen Geltungsbereich nur für die eine Methode, die mit ihm aufgerufen wird. • Er ist eine lokale Variable. Lokale Variablen gelten („leben“) immer nur in der Methode, in der sie deklariert sind. • Attribute sind keine lokalen Variablen. Sie sind Variablen, die in der gesamten Klasse bekannt sind. Sie gelten damit auch in jeder Methode, die in der Klasse deklariert ist. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 276 Ein weiteres Beispiel: Es sollen zwei Konten erstellt werden, von denen jeweils ein Betrag zugebucht und abgebucht werden kann. class Konto{ //Attribute int kontoNr; double saldo; //Methoden void einzahlen (double betrag){ saldo += betrag; } void abheben (double betrag){ saldo -= betrag; } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 277 Die Erzeugung der Objekte findet in der main()-Methode der Klasse KontoApp statt. class KontoApp{ public static void main (String args[]) { Konto k1, k2; k1 = new Konto(); k2 = new Konto(); K t () k1.kontoNr = 1; k2.kontoNr = 2; k1.saldo = 1000; k2.saldo = 500; k1.einzahlen(300); k2.abheben(40); System.out.println("Saldo von Konto " +k1 kontoNr +k1.kontoNr +": "+k1.saldo +"\nSaldo von Konto " +k2.kontoNr +": "+k2.saldo); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 278 Bemerkung zu der Klasse Konto • In der Applikation KontoApp wurden zwei Instanzen der Klasse Konto erstellt. • pp, d. h. außerhalb der Klasse Konto,, kann direkt auf die Von KontoApp, Attribute der Objekte zugegriffen werden und diese verändert werden z. B. durch k1.saldo = 1000; • Dies ist sehr gefährlich, denn somit können unkontrolliert Werte von Attributen von außen manipuliert werden, ohne dass das Objekt, d. h. der Besitzer der Attribute,, hierauf Einfluss hat. • Um dies zu verhindern, sollten Attribute stets geschützt werden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 279 Öffentlichkeit und Privatsphäre • Oft ist es sinnvoll Attribute und Methoden einer Klasse nur teilweise oder gar nicht der Öffentlichkeit zur Verfügung zu stellen. • Man spricht p von Kapselung, p g, wenn die Attribute vor der Außenwelt verborgen sind und nur über die eigenen Methoden verändert werden können. • Die Kapselung ist eines der wichtigsten Konzepte der Objektorientierung. • Somit kann kein anderes Programm oder Objekt auf verborgene Attribute zugreifen und dort unbeabsichtigt Effekte bewirken bewirken. • Dadurch wird auch verhindert, dass das Objekt unbeabsichtigt in anderen Programmen etwas zerstört. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 280 Sichtbarkeit In einer Klasse kann bei einer Definition jeder einzelnen Komponente separat spezifiziert werden, in welcher Weise der Zugriff auf diese Komponente möglich ist. Unterschieden werden kann zwischen private, protected, public und keine Angabe. Spezifizierer in selber Klasse in Unterklasse in selbem Paket private sichtbar keine Angabe sichtbar protected sichtbar sichtbar sichtbar public sichtbar sichtbar sichtbar überall sichtbar sichtbar Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 281 In JAVA sind Zugriffsmodifikatoren erlaubt für Klassen, Schnittstellen, Methoden, Konstruktoren und Attribute. Die nächste Tabelle zeigt die möglichen Zugriffsmodifikatoren für verschiedene Elemente: Element private nichts angegeben protected public Attribut X X X X Methode X X X X Konstruktor X X X X Klasse X X Schnittstelle X X Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 282 Wenn wir in der Klasse Konto.java das Attribut kontoNr und saldo mit private schützen, so kann die Applikation KontoApp nicht mehr hierauf zugreifen. class Konto{ //Attribute private int kontoNr; private double saldo; //Methoden void einzahlen (double betrag){ saldo += betrag; } void abheben (double betrag){ g saldo -= betrag; } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 283 Es müssen Methoden definiert werden, die den Zugriff auf die Attribute ermöglichen: class Konto{ private int kontoNr; private double saldo; public int getKontoNr () { return kontoNr; ; } public double getSaldo () { return saldo; } void setKontoNr ( int nummer) { kontoNr = nummer; } void setSaldo ( double kontoStand) { saldo = kontoStand; } //weitere Methoden einzahlen() und abheben() } Seite 284 Vorlesung Informatik, 1. Teil WiSe 2011/2012 public class KontoApp{ public static void main (String args[]) { Konto k1, k2; k1 = new Konto(); k2 = new Konto(); k1 setKontoNr(1); k1.setKontoNr(1); k2.setKontoNr(2); k1.setSaldo(1000); k2.setSaldo(500); k1.einzahlen(300); k2.abheben(40); System.out.println("Saldo von Konto "+k1.getKontoNr() +":" +k1.getSaldo() +"\nSaldo von Konto " +k2.getKontoNr() +": " +k2.getSaldo()); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 285 Die Applikation erzeugt kontoNr und saldo von k1 und k2 können also kontrolliert durch die Methoden der Klasse Konto verändert werden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 286 Das Beispiel Konto wird nun etwas erweitert Es soll eine Applikation programmiert werden, die 5 Konten mit einem Startguthaben von 100 Euro einrichtet und Überweisungen von einem Konto zu einem anderen Konto durchführt. durchführt Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 287 public class Konto{ //Attribute private int kontoNr; private double saldo; //Konstruktor public Konto(int kontoNr){ this.kontoNr = kontoNr; saldo = 100; //Startguthaben } //Methoden public int getKontoNr(){ return kontoNr; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 288 public double getSaldo(){ return saldo; } public void einzahlen (double betrag){ saldo += + betrag; } public void abheben (double betrag){ saldo -= betrag; } public void ueberweisen(Konto nachKonto, double betrag){ saldo -= betrag; nachKonto.einzahlen(betrag); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 289 //Applikation, die Konten erzeugt und Überweisungen ermöglicht import javax.swing.JOptionPane; class KontoApp{ public static void main (String args[]) { final int ANZAHL_KONTEN = 5; //erzeugt Array von Konten mit Kontonummer 0,1,2,3,4 Konto kontoArray[] = new Konto[ANZAHL_KONTEN]; for (int i = 0; i< kontoArray.length;i++){ kontoArray[i] = new Konto(i); } Konto vonKonto, nachKonto; double betrag; String eingabe, ausgabe; Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 290 eingabe =JOptionPane.showInputDialog("Überweisung von Kontonr."); vonKonto = kontoArray[Integer.parseInt(eingabe)]; eingabe = JOptionPane.showInputDialog("...nach Kontonr."); nachKonto = kontoArray[Integer.parseInt(eingabe)]; eingabe = JOptionPane.showInputDialog("Betrag:"); betrag g = Double.parseDouble(eingabe); p g //Überweisung durchführen: vonKonto.ueberweisen(nachKonto, betrag); //Ausgabe: ausgabe = "Kontostand von Kontonr." + vonKonto.getKontoNr(); ausgabe += ": " + vonKonto.getSaldo() + " Euro \n"; ausgabe + += "Kontostand von Kontonr Kontonr."+ "+ nachKonto nachKonto.getKontoNr(); getKontoNr(); ausgabe += ": " + nachKonto.getSaldo() +" Euro"; JOptionPane.showMessageDialog(null,ausgabe); System.exit( 0 ); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 291 Die Deklaration eines Konstruktors • Konstruktoren sind Methoden zur Initialisierung von Objektattributen. • Konstruktoren heißen genau wie die Klasse. • Im Unterschied zu anderen Methoden wird bei ihnen kein Rückgabewert deklariert. • Konstruktoren werden bei der Objekterzeugung mit dem new-Operator aufgerufen. • Ein Konstruktor hat allgemein die Syntax: KlassenName (Datentyp p1,…,Datentyp pn){ Anweisungen; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 292 Bemerkung zum Standardkonstruktor • Stellt der Compiler fest, dass kein Konstruktor programmiert wurde, so baut der automatisch selbst einen in den Bytecode ein. • Diesen nennt man Standardkonstruktor. • Der Standardkonstruktor ist immer parameterlos. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 293 Das Schlüsselwort this • Der Bezeichner this dient dazu, auf das Objekt selbst zu verweisen • Auf eine eigene Methode oder ein eigenes Attribut kann man verweisen mit der Syntax this.methode() bzw. this.attribut • Solange die Attributnamen nicht mehrdeutig sind, braucht this nicht benutzt zu werden. • this muss verwendet werden, wenn es Namenskonflikte mit gleichnamigen lokalen Variablen gibt (s. kontoNr ist einmal das Attribut von Konto und einmal der Name des Eingabeparameters des Konstruktors). • Bemerkung: Namenskonflikte könnten natürlich auch vermieden werden, indem man der lokalen Variable einen anderen Namen gibt. In der Praxis wird aber gerade bei Konstruktormethoden hiervon Abstand genommen. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 294 Noch ein Beispiel für das Arbeiten mit Objekten Problembeschreibung: Ein Computerprogramm soll die Laufzeiten der Teilnehmer eines Rennens ermitteln. Eingegeben werden Startzeit und Ankunftszeit eines Läufers Läufers. Version 1.0: Zunächst sollen die Zeiten in vollen Stunden angegeben werden. Die Software wird mit Hilfe der drei Phasen entwickelt: Analyse: Anforderungen an die Software ermitteln und beschreiben (Verwendung von Klassendiagrammen) Entwurf: Aufbauend auf der Analyse, die Softwarearchitektur und die Spezifikation der Komponenten erstellen (insb. Algorithmen der Methoden) Implementierung: Codierung der Klassen und Programme Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 295 /* Die Klasse ermöglicht die Berechnung die Gesamtlaufzeit eines Läufers */ class Laeufer{ //Attribute private int startZeit, ankunftsZeit, laufDauer; //Konstruktor: Laeufer(int startZeit, int ankunftsZeit){ this.startZeit = startZeit; this.ankunftsZeit = ankunftsZeit; } i t getLaufDauer int tL fD (){ laufDauer = ankunftsZeit - startZeit; return laufDauer; } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 296 Die zugehörige Applikation des Beispiels import javax.swing.JOptionPane; class LaufZeitApp{ public static void main (String args[]){ String ersteEingabe, zweiteEingabe, ausgabe; int start, ankunft, dauer; //Einlesen der Eingabestrings: ersteEingabe = JOptionPane.showInputDialog ("Gib die Startzeit des Läufers ein:"); zweiteEingabe = JOptionPane.showInputDialog ("Gib die Ankunftzeit ein:"); //Konvertierung String in int: start = Integer.parseInt(ersteEingabe); ankunft = Integer.parseInt(zweiteEingabe); Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 297 //Erzeugung eines speziellen Läufers mit start,ankunft-Zeit Laeufer teilnehmer = new Laeufer(start,ankunft); //Berechnung Laufdauer dauer = teilnehmer.getLaufDauer(); //Erzeugung Ausgabestring ausgabe = "Die Laufzeit betraegt " +dauer + " Stunden."; //Ausgabe auf dem Bildschirm JOptionPane.showMessageDialog (null, ausgabe); System.exit( 0 ); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 298 Version 2.0: Genauere Zeitangaben Die Laufzeit soll ebenfalls mit Stunde, Minute und Sekunde ausgegeben werden. Die Eingabe der Zeiten soll im Format hh:mm:ss erfolgen. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 299 import javax.swing.JOptionPane; class LaufZeitApp { public static void main (String args[]){ String ersteEingabe, zweiteEingabe, ausgabe; Uhrzeit start, ankunft; String dauer; //Einlesen der Eingabestrings: ersteEingabe = JOptionPane.showInputDialog ("Startzeit (hh:mm:ss)"); zweiteEingabe = JOptionPane.showInputDialog ("Ankunftszeit (hh:mm:ss)"); //Erzeugung zweier Objekte der Klasse Uhrzeit: start = new Uhrzeit (ersteEingabe); ankunft = new Uhrzeit (zweiteEingabe); Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 300 //Erzeugung eines speziellen Läufers Laeufer teilnehmer = new Laeufer(start,ankunft); //Berechnnung Laufdauer: dauer = teilnehmer.getLaufDauer(); //erzeuge Ausgabestring: ausgabe = "Die Laufzeitzeit betraegt " +dauer ; //Ausgabe auf dem Bildschirm JOptionPane.showMessageDialog (null, ausgabe); System.exit( 0 ); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 301 /* Die Klasse ermöglicht die Berechnung der Laufzeit eines Laeufers */ class Laeufer{ //Attribute private Uhrzeit startZeit, ankunftsZeit; private i t String St i l laufDauer; fD //Konstruktor Laeufer(Uhrzeit startZeit, Uhrzeit ankunftsZeit){ this.startZeit = startZeit; this.ankunftsZeit = ankunftsZeit; } //Methode String getLaufDauer (){ laufDauer = ankunftsZeit.minus(startZeit); return laufDauer; } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 302 //Die Klasse ermöglicht die Berechnung der Zeiten im Format hh:mm:ss class Uhrzeit{ //Attribute private int stunde, minute, sekunde; //Konstruktor Uhrzeit (String text) { stunde = Integer.parseInt (text.substring(0,2)); minute = Integer.parseInt (text.substring (3,5)); sekunde = Integer.parseInt (text.substring (6,8)); } //Methoden int rechneInSekunden() { int sekundenZeit; //Uhrzeit in Sekunden (lokale Variable) sekundenZeit = sekunde; sekundenZeit = sekundenZeit + 60*minute; sekundenZeit = sekundenZeit + 3600*stunde; return sekundenZeit; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 303 String minus (Uhrzeit zeit){ //subtrahiert die Uhrzeit zeit und gibt String in h,m,s zurueck int differenz, diffStunde, diffMinute, diffSekunde; String rueckgabe =""; differenz = rechneInSekunden() - zeit.rechneInSekunden(); diffStunde = differenz / 3600; differenz = differenz % 3600; diffMinute = differenz / 60; diffSekunde = differenz % 60; rueckgabe += diffStunde + " h "; rueckgabe += diffMinute + " min "; rueckgabe += diffSekunde +" sec "; return rueckgabe; } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 304 Die Methode substring() Sie ist definiert durch substring (int beginn, int ende). Sei text ein String. Dann liefert der Methodenaufruf text.substring(3,5), einen Teilstring, der aus dem 4. bis 5. Element von text besteht (Strings beginnen mit dem Index 0). Beispiel: String text = “HALLO“; S i String text2 2 = text.substring(0,2); b i (0 2) ergibt text2 = “HA“; Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 305 Referenzdatentypen im Vergleich zu primitiven Datentypen In JAVA gibt es fundamentale Unterschiede zwischen Objekten und Daten vom primitiven Datentyp, d. h. int, double, boolean, char, long, float. • Eine Variable eines primitiven Datentyps kann nur genau einen Wert zu einem bestimmten Zeitpunkt annehmen • Objekte bestehen aus Daten, d. h. aus Objekten oder primitiven Datentypen und u d haben abe Methoden. et ode Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 306 • Variablen vom primitiven Datentyp belegen einen bestimmten Platz im Speicher. Bei Verwendung im Programm wird ihr Wert kopiert und verarbeitet (Bsp. int a = 5; int b = a). • Eine Variable, die ein Objekt darstellt, ist dagegen eine Referenz auf den Speicherort, an dem sich das Objekt befindet, also seine Speicheradresse. Man nennt sie daher Referenzdatentypen. • Bei Verwendung im Programm wird die Referenz übergeben. Das nächste Programm veranschaulicht den Unterschied zwischen Referenzdatentypen und primitiven (elementaren) Datentypen. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 307 Eine Klasse IntZahlen sei wie folgt definiert: public class IntZahlen { //Attribut ; int zahl; //Konstruktor IntZahlen ( int zahl) { this.zahl = zahl; } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 308 import javax.swing.*; public class VergleichDatenTypen { public static void main (String args[]) { IntZahlen zahl1, zahl2; int x, y; String ausgabe; //primitive Datentypen x = 1; y = x; y = 2; //Objekte zahl1 = new IntZahlen (1); zahl2 = zahl1; zahl2.zahl = 2; //Ausgabe ausgabe = "x x = "+ + x +"\ny + \ny = " +y; ausgabe += "\nWert der Zahl des Objektes zahl1: " + zahl1.zahl; ausgabe += "\nWert der Zahl des Objektes zahl2: " + zahl2.zahl; JOptionPane.showMessageDialog ( null, ausgabe) ; System.exit (0); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 309 Die Applikation erzeugt die folgende Ausgabe • Da x und y primitive Datentypen sind, wird durch y = x der Wert kopiert. Eine Veränderung von y führt daher nicht zu einer Veränderung von x. • zahl1 hl1 und d zahl2 hl2 sind i d vom Datentyp D t t IntZahlen, hl also l von einem i Referenzdatentyp. Somit wird durch zahl2 = zahl1 bewirkt, dass beide Variablen auf das selbe Objekt zeigen und dieses verändern können. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 310 Gleichheit von Objekten und die Methode equals() Durch objekt1 == objekt2 werden die Referenzen auf die Objekte miteinander verglichen. Möchte man aber die Inhalte zweier Objekte miteinander vergleichen, so kann die Methode equals() verwendet werden. string1.equals(string2) ist true, wenn die beiden Strings string1 und string2 identisch sind. objekt1.equals(objekt2) ist dagegen true, wenn die Referenzen übereinstimmen. Um die Inhalte auf Gleichheit zu Überprüfen müssen die einzelnen Attribute explizit angegeben werden bzw. die Methode equals() überschrieben werden. Beispiel: objekt1.name.equals(objekt2.name) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 311 Garbage Collection (Müllsammlung) • Werden Objekte mit new angelegt, so wird im Hauptspeicher Platz für diese Objekte bereitgestellt. • Im Gegensatz zu anderen Programmiersprachen wird dieser Speicherplatz wieder freigegeben, sobald er nicht mehr benötigt wird. • Diese Freigabe geschieht, indem eine sog. garbage collection automatisch durchgeführt wird. • Die garbage collection startet dann, wenn JAVA Speicherplatz benötigt. • Man kann sie auch explizit mit System.gc() aufrufen. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 312 Exceptions • Exceptions sind in JAVA Objekte. Man unterscheidet zwischen • Error: schwerer Systemfehler • Exception: „normaler Fehler“, der vom Programm kontrolliert werden kann • Eine „Ausnahme“ oder Exception zeigt an, dass ein Problem während der Ausführung eines Programms aufgetaucht ist, z. B. Division durch 0, Bereichsüberschreitung von Array-Indizes, Nichtkompatible Datentypen beim Typumwandeln, unbekannte Datei beim Lesen,.... • Solche Fehler bringen ein Programm meist zum Absturz, wenn sie nicht abgefangen werden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 313 Beispiele für Exceptions Werden die Array Grenzen nicht eingehalten (s. Programmbeispiel), so wird zur Laufzeit die folgende Exception erzeugt und das Programm wird beendet. class ArrayGrenzen{ public static void main (String args[]) { int a[] = new int [10]; //Initialisierung for(int i = 0;i< a.length;i++) a[i] = i i*i; i; for (int i = a.length; i>=0;i--) System.out.println (a[i]); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 314 Wird im Programm durch 0 dividiert, so wird zur Laufzeit die folgende Exception erzeugt und das Programm wird beendet. Falsche Formate erzeugen eine NumberFormatException class Cast{ public static void main (String args[]) { String s1="12", s2 = "a"; int i1 = Integer.parseInt(s1); int i2 = Integer.parseInt(s2); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 315 • Exceptions sind Objekte der Klasse Exception aus dem Paket java.lang oder einer Unterklasse (z. B. NumberFormatException). • Errors sind Objekte der Klasse Error. • Die Klassen Exception sowie Error sind Unterklassen von Throwable. Throwable • „Ausnahmen“, die von Error oder von RuntimeException abgeleitet sind, sind unkontrollierte Ausnahmen • Alle anderen „Ausnahmen“ sind kontrollierte Ausnahmen. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 316 Exception Handling • Eine Ausnahme Behandlung kann in JAVA durch eine Kombination von einem try- (Versuchen) mit einem oder mehreren catch- (Abfangen) Codeblöcken erfolgen. Der try-Block legt den Programmbereich fest, der überwacht wird, d. h. der eine Ausnahme erzeugen/auswerfen könnte. try{ Anweisungen, die eine Ausnahme verursachen können; }catch (Ausnahmetyp e1){ g zum Reagieren g und Beheben;; Anweisungen }catch (Ausnahmetyp e2){ Anweisungen zum Reagieren und Beheben; }…weitere catches Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 317 Das folgende Programm reagiert auf den Laufzeitfehler im Programm Cast.java class Cast2{ public static void main (String args[]) { String s1="12", s2 = "a", s3 = "9"; int i1,i2,i3 ; i1= i2 = i3 = 0; try{ i1 = Integer.parseInt(s1); i2 = Integer.parseInt(s2); i3 = Integer.parseInt(s3); }catch(NumberFormatException e){ System.out.println("Keine Zahl"); } System.out.println(i1+i2+i3); System.out.println(i1*i3); System.out.println(i1 i3); } } Das Programm liefert die Ausgabe Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 318 Optional kann nach dem catch-Block ein finally-Block folgen. Der Teil im finally Block wird immer ausgeführt, auch wenn in try und catch ein return, break, oder continue steht. y lautet dann Die Syntax try{ Anweisungen, die eine Ausnahme verursachen können; }catch (Ausnahmetyp e1){ Anweisungen zum Reagieren und Beheben; } …weitere catches finally { Anweisungen; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 319 Die folgende Applikation Wochentag2.java fängt Fehler der Kategorie ArrayIndexOutOfBoundsException und NumberFormatException sowie eine Exception, die durch das Klicken des Abbruch-Buttons erzeugt wird. Hier wird der Fehler explizit mit der throw-Anweisung ausgeworfen. Eine Exception kann mit throw new Ausnahmetyp(); geworfen (erzeugt) werden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 320 import javax.swing.JOptionPane; class Wochentag2{ public static void main (String args[]) { String eingabe, ausgabe; int zahl; String wochentag[] = { Sonntag , Montag , Dienstag , Mittwoch , {"Sonntag","Montag","Dienstag","Mittwoch", "Donnerstag","Freitag","Samstag"}; while (true){ try{ eingabe = JOptionPane.showInputDialog ("Eingabe Wochentag"); if (eingabe == null) //User klickt "abbrechen" throw new Exception ("Ende"); int hilf = Integer.parseInt(eingabe); zahl = hilf-1; //Tag 1 ist Sonntag, Tag 7 ist Samstag Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 321 ausgabe = "Der Tag "+hilf+" ist ein“+wochentag[zahl]; JOptionPane.showMessageDialog(null,ausgabe); }catch (ArrayIndexOutOfBoundsException ab){ JOptionPane.showMessageDialog(null, "kein Wochentag"); } catch (NumberFormatException nfe){ JOptionPane.showMessageDialog(null,"keine Zahl!"); } catch (Exception e){ JOptionPane.showMessageDialog(null,"Tschuess"); System.exit(0); y } } } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 322 throws im Methodenkopf angeben Neben dem Einzäunen von problematischen Blöcken durch einen try- und catchBlock gibt es noch eine andere Möglichkeit auf Exceptions zu reagieren: Im Methodenkopf wird eine throws-Klausel eingeführt. Beispiel String readFirstLineFromFile (String filename) throws java.io.IOException{ ….}; Dadurch zeigt eine Methode an, dass sie möglicherweise eine Exception auswerfen wird, aber diese nicht selbst behandelt, sondern diese unter Umständen an die aufrufende Methode weitergibt weitergibt. Eine Methode muss alle kontrollierten Ausnahmen, die sie auslösen kann, auch deklarieren. (D.h. Ausnahmen, die von der Klasse Error und RuntimeException abgeleitet sind, müssen nicht angekündigt werden). Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 323 Vererbung • Die Vererbung ist eines der wesentlichsten Konzepte der Objektorientierung. • Vererbung ist ein Mechanismus, der es erlaubt, bestehenden Programmcode zu benutzen und ihn den eigenen Bedürfnissen anzupassen. • Die abgeleitete Klasse, d. h. die Subklasse übernimmt die Attribute und Methoden der Elternklasse (Superklasse). • Die Subklasse kann selbst entscheiden,, welche Attribute und Methoden sie übernehmen will und welche sie hinzufügen bzw. überschreiben will. • In JAVA kann jede Subklasse nur eine Superklasse haben. Man spricht von Einfachvererbung. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 324 • Im folgenden Beispiel ist die Klasse Abteilungsleiter eine Subklasse von Mitarbeiter. • Dies wird durch das reservierte Wort extends im Kopf der Klasse ausgedrückt. class Abteilungsleiter extends Mitarbeiter • Ein Objekt der Klasse Abteilungsleiter kann damit die Attribute und Methoden von Mitarbeiter nutzen. Im Beispiel wird ein zusätzliches Attribut eingesetzt sowie zwei Methoden hinzugefügt. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 325 public class Mitarbeiter{ private String name; private int personalNummer; private double gehalt; } void setName (String name){ this.name = name; } void id setPersonalnummer(int tP l (i t personalNummer){ lN ){ this.personalNummer = personalNummer; } void setGehalt (double gehalt){ this.gehalt = gehalt; } void drucke () { System.out.print("\nName: " + name); System.out.print ("\tPersonalnummer: " + personalNummer); y p ( \ " + g gehalt); ); System.out.print("\tGehalt: } void erhoeheGehalt (double betrag){ gehalt += betrag; } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 326 public class Abteilungsleiter extends Mitarbeiter{ //Attribute: private String abteilung; //zusätzliches Attribut //Methoden void setAbteilung (String abteilung){ this abteilung = abteilung; this.abteilung } void ausgabeAbteilung () { System.out.println ("\tLeiter Abteilung: " + abteilung); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 327 public class MitarbeiterApplikation{ public static void main(String args[]){ Mitarbeiter uwe = new Mitarbeiter(); uwe.setName("Maier"); uwe.setPersonalnummer(13); uwe.setGehalt(2000); uwe drucke(); uwe.drucke(); Abteilungsleiter anja = new Abteilungsleiter(); anja.setName ("Mueller"); anja.setPersonalnummer ( 25); anja.setGehalt ( 4030); anja.setAbteilung ("F3O Projekte"); anja.erhoeheGehalt (300); anja.drucke(); anja.ausgabeAbteilung (); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 328 Die Applikation liefert die Ausgabe Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 329 Methoden überschreiben Es ist auch möglich, bestehende Methoden in der Subklasse zu überschreiben. Beim Überschreiben definiert man eine Methode in der Subklasse exakt so,, wie sie in der Elternklasse definiert ist. Wird die Methode in der Kindklasse aufgerufen, wird nicht die geerbte Methode der Elternklasse (Superklasse) sondern die der Kindklasse benutzt. Im nächsten Beispiel wird die Methode drucke() d k () überschrieben. überschrieben Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 330 Mit dem reservierten Wort super kann auf die Methoden und Attribute der Mutterklasse zugegriffen werden. Im Beispiel ist allerdings ein super.gehalt nicht möglich, da die Attribute in der Superklasse mit private geschützt sind. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 331 public class Abteilungsleiter extends Mitarbeiter{ //Attribute: private String abteilung; //zusätzliches Attribut void setAbteilung (String abteilung){ this.abteilung = abteilung; } //Methode drucke() wird überschrieben void drucke () { super.drucke(); System.out.println ("\tLeitung Abteilung: " +abteilung); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 332 Das Arbeiten mit Konstruktoren Im nächsten Beispiel ändern wir nun die Klassen, indem wir Konstruktoren verwenden. g den Der Konstruktor der Subklasse muss als erste Anweisung Konstruktoraufruf der Suberklasse haben. Dieser Aufruf erfolgt auch mit super, im Beispiel super (name,personalNummer,gehalt); Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 333 public class Mitarbeiter{ //Attribute: private String name; private int personalNummer; private double gehalt; //Konstruktor: public Mitarbeiter(String name, int personalNummer, double gehalt){ this.name = name; thi this.personalNummer = personalNummer; this.gehalt = gehalt; } //Methoden: public void drucke () { System.out.println(); System.out.print ("Name: " + name); System.out.print ("\tPersonalnummer: " + personalNummer); System.out.print("\tGehalt: " + gehalt); } public void erhoeheGehalt (double betrag){ gehalt += betrag; } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 334 public class Abteilungsleiter extends Mitarbeiter{ //Attribute: private String abteilung; //zusätzliches Attribut //Konstruktor public Abteilungsleiter (String name, int personalNummer, double gehalt, String abteilung) { //Aufruf des Konstrukors von Mitarbeiter super (name, personalNummer,gehalt); this.abteilung = abteilung; } public void drucke () { super.drucke(); System.out.println ("\tAbteilung: " + abteilung); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 335 public class MitarbeiterApplikation{ public static void main(String args[]){ Mitarbeiter uwe = new Mitarbeiter("Maier", 13, 2000); Abteilungsleiter anja = new Abteilungsleiter ("Mueller", 25,4030,"F30 Projekte"); uwe.drucke(); anja.erhoeheGehalt(300); j h h G h lt(300) anja.drucke(); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 336 Die Speicherung in einem Array ergibt public class PersonalVerwaltung{ public static void main(String args[]){ Mitarbeiter personal [] ={new Mitarbeiter("Maier", 13, 2000), ne Abteilungsleiter new Abteil ngsleite ("M ("Mueller", elle " 25 25,4030,"F30 4030 "F30 P Projekte")}; ojekte")} for (int i = 0;i < personal.length; i++) personal[i].drucke(); } } Beim Aufruf der Methode drucke() wird unterschieden, ob es sich um ein Objekt j Mitarbeiter oder Abteilungsleiter g handelt. Dies bezeichnet man als späte Bindung bzw. Polymorphie. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 337 Späte Bindung - Polymorphie Hat eine Unterklasse eine Methode der Elternklasse überschrieben, so wird erst zur Laufzeit dynamisch die entsprechende Objektmethode, passend zum tatsächlichen Typ des aufrufenden Objekts, ausgewählt. Die späte Bindung ist eine Anwendung der Polymorphie, wird aber hier synonym verwendet. Beispiel: personal[0] und personal[1] sind beide vom Datentyp Mitarbeiter. personal[1] ist jedoch ein Objekt einer Unterklasse von Mitarbeiter, nämlich von Abteilungsleiter. Sowohl Mitarbeiter als auch Abteilungsleiter verfügen über eine Methode drucke(). Erst zur Laufzeit wird diese Methode gebunden, d. h. erst dann wird entschieden, dass zu personal[1] die Methode drucke() von Abteilungsleiter gehört. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 338 Bemerkung zur Polymorphie Polymorphie existiert nicht bei privaten (private), statischen (static) und finalen (final) Methoden. final-Methoden final Methoden können nicht überschrieben werden und sind daher nicht polymorph gebunden. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 339 Welche Ausgabe liefert die folgende Applikation? class Klasse1{ public Klasse1(){ System.out.println("Konstruktor Klasse1"); } public Klasse1 (int dummy){ System.out.println("Konstruktor mit dummy Klasse1"); } } class Klasse2 extends Klasse1{ public Klasse2(){ System.out.println("Konstruktor Klasse2"); } public Klasse2 (int dummy){ super (dummy); System.out.println("Konstruktor mit dummy Klasse2"); } } public class Konstruktor { public static void main (String args[]){ Klasse2 k = new Klasse2(); Klasse2 l = new Klasse2(1); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 340 Die Klasse Object • Die Klasse Object ist in der Vererbungshierarchie die höchste Klasse. Sie ist die Elternklasse für alle anderen Klassen. • p Immer wenn eine Klasse definiert wird,, dabei aber keine explizite Ableitung mittels extends angegeben wird, fügt JAVA automatisch extends Object hinzu. • Eine Methode der Klasse Object, die wir bereits kennen gelernt haben ist: equals(Object) l (Object) Überprüfung auf Gleichheit Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 341 Zeichenketten: Die Klassen String und StringBuffer • Strings, d. h. Zeichenketten sind in JAVA Objekte. • In JAVA gibt es zwei Klassen von Strings, dies sind die Klassen String und StringBuffer. g • Objekte der Klasse String stellen Zeichenketten mit fester Länge, d. h. konstante Zeichenketten, dar. • Objekte der Klasse StringBuffer stellen Zeichenketten dar, die zur Laufzeit des Programms verkürzt oder verlängert werden können. Zudem gibt es verschiedene Methoden zur Textbearbeitung Textbearbeitung. • Die Klassen String und StringBuffer sind aus dem Paket java.lang Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 342 Die Klasse String Objekte der Klasse sind konstante Zeichenketten. Sie haben folgende Eigenschaften: werden • Die Länge eines Strings steht fest und kann nicht mehr verändert werden. • Der Inhalt des Strings kann nicht verändert werden. D.h. alle Methoden aus der Klasse String, die zur Manipulation auf das String Objekt angewendet werden, geben eine entsprechend manipulierte Kopie des Strings zurück. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 343 Eine konstante Zeichenkette mit beispielsweise dem Inhalt „Peter“ wird entweder durch die Anweisung String name = "Peter"; oder durch ode du c die d e Anweisung e su g String name = new String("Peter"); erzeugt. name ist also in beiden Fällen eine Referenz auf ein Objekt. j Im ersten Fall spricht man von einer impliziten Erzeugung eines String-Objektes. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 344 Der Unterschied ist, dass im zweiten Fall durch den new-Operator auf jeden Fall ein neues String-Objekt erzeugt wird und damit Speicher belegt wird. g der Fall sein. Im ersten Fall muss dies nicht unbedingt Bei optimierenden Compilern können String-Objekte, die den gleichen Inhalt haben und implizit erzeugt werden, wieder verwendet werden. Beispiel: Durch String name = "Peter"; String name2 = "Peter"; erzeugen optimierende Compiler nur ein Objekt, auf das die zwei Referenzen name und name2 beide zeigen. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 345 Zur Erinnerung: Strings werden mit der Methode equals() verglichen. if (name.equals(name2)) ……. vergleicht die Inhalte der beiden Strings name und name2. Auf den nächsten Folien werden einige weitere String-Methoden erläutert (schauen (sc aue S Sie eb bitte tte auc auch in de der API nach). ac ) Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 346 Länge eines Strings durch length() Die Methode length() ermittelt die Länge eines Strings. String a = "Grundlagen"; int l = a.length(); ergibt l = 10 Zeichen ersetzen mit replace() Die Methode erzeugt ein neuen String indem die Zeichen aus dem Original ersetzt wurden. String s1 = "JAVA"; String s2 = s1.replace('a', 'A' ); liefert für s2 JAvA, d. h. das a wurde in A verändert. s1 bleibt unverändert. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 347 Stringteile extrahieren mit substring() Die Methode substring(a,b) liefert einen neuen String als Teilstring des Originals. a gibt die Startposition an, b die erste Position, die nicht mehr zum Substring gehören soll. String subtitel = thema.substring(1,3); System.out.println(subtitel); ergibt als Ausgabe av Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 348 Anfang und Ende des Strings mit startsWith() und endsWith() Die Methode startsWith(anfang) überprüft, ob der String mit anfang anfängt. String titel = "Titel: Grundlagen der Informatik"; boolean s = titel.startsWith("Titel"); S t System.out.println(s); t i tl ( ) ergibt also true. Die Methode endsWith(ende) überprüft, ob der String mit ende aufhört. boolean ende = titel.endsWith ( ("Informatik"); ) System.out.println(ende); ergibt true. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 349 Zeichen im String suchen mit indexOf() Die Methode indexOf(zeichen) gibt die Position aus, an der das zeichen das erste mal im String vorkommt. Mit String thema = "JAVA"; int p = thema.indexOf ('a'); ergibt sich für p der Wert 1. Ist das Zeichen im String nicht enthalten, so liefert die Methode den Wert –1. Suchen eines Zeichens ab einer bestimmten Position wird durch Angabe eines weiteren Parameters ermöglicht: int p = thema.indexOf ('a'‚2); ergibt für p den Wert 3. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 350 Ist eine Zeichenfolge im String vorhanden? Seit JAVA 1.5 ist es mit Hilfe der Methode contains(zeichenkette) möglich, innerhalb eines String eine Zeichenkette zu suchen. Die Methode gibt true zurück, falls die Zeichenkette im String vorhanden ist und false, falls nicht. String s = "Informatik"; s.contains("for"); ergibt true. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 351 Vergleich zweier Strings auf „Größe“ mit compareTo() Durch den Methodenaufruf string1.compareTo(string2) werden die beiden Strings string1 und string2 auf ihre lexikographische Größe verglichen. Der Rückgabewert g ist vom Datentyp yp int. Er ist 0 bei Gleichheit,, negativ, g , falls string1 lexikographisch kleiner ist als string2 und positiv, falls string1 lexikographisch größer als string2 ist. String string1 = "Peter", string2 = "Tina", string3 = "Peter" , string4 = "Andrea"; Dann ist string1.compareTo(string2); kleiner als 0 string1.compareTo(string3); gleich 0 string1.compareTo(string4); größer als 0 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 352 Die Klasse StringBuffer StringBuffer-Objekte sind Zeichenketten mit folgenden Eigenschaften: • Die Länge der Zeichenkette ist nicht festgelegt. Sie vergrößert sich g j weitere Zeichen angefügt g g werden automatisch,, wenn im StringBuffer-Objekt und der vorhandene Platz nicht ausreicht. • Der Inhalt einer Instanz der Klasse StringBuffer lässt sich verändern. D.h. die Methoden aus der Klasse StringBuffer, die zur Manipulation auf das StringBuffer Objekt angewendet werden, manipulieren das StringBuffer Objekt j selber und g geben es zusätzlich zurück. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 353 Das Erzeugen eines StringBuffer-Objektes StringBuffer-Objekte müssen immer mit Hilfe des new-Operators erzeugt werden. Es g gibt insgesamt g drei Konstruktoren für die Klasse StringBuffer. g • StringBuffer() Erzeugt StringBuffer-Objekt, das zunächst 16 Zeichen aufnehmen kann • StringBuffer(int length) Erzeugt StringBuffer-Objekt, das length Zeichen aufnehmen kann • StringBuffer(String str) Es wird ein StringBuffer-Objekt erzeugt und mit einer Kopie des Strings str initialisiert. Zusätzlich wird bereits Platz für 16 weitere Zeichen eingeplant. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 354 Die Länge eines StringBuffer-Objektes lesen und setzen Unterschieden wird zwischen den Methoden length() und capacity(). • Die Methode length() ermittelt die Anzahl der enthaltenen Zeichen. • Die Methode capacity() it () ermittelt die Kapazität, Kapazität d. d h. h den gesamten Speicherplatz ( belegter und freier Speicherplatz). Diese Kapazität wird automatisch angepasst, wenn weitere Zeichen eingebaut werden. Man kann sie aber auch manuell einstellen. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 355 Beispiel StringBuffer text1 = new StringBuffer(); StringBuffer text2 = new StringBuffer(20); StringBuffer text3 = new StringBuffer("Vorlesung"); System.out.println(text1); System.out.println(text1.length()); System.out.println(text1.capacity()); //Ausgabe 0 //Ausgabe 16 System.out.println(text2); System.out.println(text2.length()); System.out.println(text2.capacity()); //Ausgabe 0 //Ausgabe 20 System.out.println(text3); System.out.println(text3.length()); S t System.out.println(text3.capacity()); t i tl (t t3 it ()) //Ausgabe „Vorlesung“ //Ausgabe 9 //A //Ausgabe b 25 Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 356 Zeichen anhängen, einfügen, löschen • Die Methode append() hängt Werte an eine Zeichenkette an. Der interne Platz wird dabei –falls nötig- automatisch vergrößert. Ein neues StringBufferObjekt wird nicht erzeugt. • Durch die Methode insert() können Zeichenketten und primitive Datentypen an einer beliebigen Stelle eingefügt werden. Der erste Parameter der Methode gibt die gewünschte Position an (1. Zeichen hat Position 0). Der zweite Parameter gibt den Inhalt an. • Die Methode setCharAt() () überschreibt einzelne Zeichen. Der erste Parmameter gibt die Position des zu ersetzenden Zeichens an, der zweite Parameter gibt das neue Zeichen an. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 357 • Die Methode reverse() dreht die Reihenfolge der Zeichen um. • Die Methode delete() löscht einen Teil der Zeichenkette. Der erste Parameter gibt die Position des ersten zu löschenden Zeichens an, der zweite Parameter gibt die Position des ersten Zeichens an, das nicht mehr gelöscht werden soll. Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 358 Beispiel class BeispielStringBuffer{ public static void main (String args[]){ StringBuffer text3 = new StringBuffer("Vorlesung"); text3.append(" JAVA"); System.out.println(text3); text3.insert(9," Ueber"); System.out.println(text3); Ausgabe des Programms text3.setCharAt(10,'u'); System.out.println(text3); text3.reverse(); System.out.println(text3); text3.delete(4,10); System.out.println(text3); } text3.reverse().append(" Teil").append(" 2"); System.out.println(text3); } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 359 Vergleiche von Zeichenketten als String und StringBuffer Um zwei StringBuffer-Objekte bzw. ein StringBuffer- und ein String-Objekt auf Gleichheit zu überprüfen, müssen die StringBuffer-Objekte in Strings umgewandelt werden: • Umwandeln des/der StringBuffer-Objekte in Strings mit Hilfe der Methode toString() und danach Vergleich mit equals(): StringBuffer text1 = new StringBuffer("JAVA"); String text2 = "JAVA"; System.out.println(text2.equals(text1.toString())); Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 360 Vergleiche von Zeichenketten als String und StringBuffer Der Vergleich eines StringBuffer-Objektes mit einem String kann seit Version 1.4 auch mit Hilfe der Methode contentEquals() erfolgen: Benutzung der Methode contentEquals(StringBuffer) t tE l (St i B ff ) • System.out.println(text2.contentEquals(text1)); Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 361 Ein weiteres Beispiel Testen, ob der String s ein Palindrom ist. Palindrome lesen sich vorwärts genauso wie rückwärts, z. B. OTTO import javax.swing.*; class Palindrom{ public static void main (String args[]){ String s = JOptionPane.showInputDialog (null, "Geben Sie einen String ein"); boolean isPalindrom = s.contentEquals(new StringBuffer(s).reverse()); if (isPalindrom) System.out.println(s+" S stem o t println(s+" ist ein Palindrom"); Palind om") else System.out.println (s +" ist kein Palindrom"); System.exit(0); } } Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 362 Bemerkung zum Palindrom-Beispiel Die Zeile boolean isPalindrom = s.contentEquals(new StringBuffer(s).reverse()); kann auch ersetzt werden durch boolean isPalindrom = new StringBuffer(s).reverse().toString().equals(s); Vorlesung Informatik, 1. Teil WiSe 2011/2012 Seite 363