Grundlagen der Programmierung –Teil1 Einheit 1 - 9.Okt. 2009 GDP DDr. Karl D. Fritscher basierend auf der Vorlesung “Grundlagen der Programmierung” von DI Dr. Bernhard Pfeifer VO Abschluss • Prüfung: 45-minütige schriftliche Prüfung (Ende Nov.- Anfang Dez.) Zwischenprüfung (BMI) bzw. Endprüfung 1.Teil (Mechatronik) Positives Abschneiden ist Voraussetzung für das Antreten zur 2. Prüfung • Übungen: auf freiwilliger Basis Bonuspunkte für Prüfung Grundbegriffe • • • Computer und ihre Anwendungen sind aus dem täglichen Leben innerhalb der Arbeitswelt wie auch in der Freizeit nicht mehr wegzudenken. Fast überall werden heutzutage Daten verarbeitet oder Geräte elektronisch gesteuert. In fast jedem Gerät befinden sich Mikroprozessoren, welches mit Hilfe von Software bestimmte Aufgaben erledigt, oder zumindest zu erledigen versucht Aus diesem Grund werden wir uns nun ein wenig mit den grundlegenden Prinzipien der Informatik vertraut machen. Computer, Software, Informatik • Computer (deutsch: Rechner) • als Computer wird ein technisches Gerät bezeichnet, welches schnell und zuverlässig Daten sowie Informationen verarbeiten sowie speichern kann. Im Unterschied zu einem normalen Automaten, wie einem Geldautomaten, kann ein Computer verschiedene Vorschriften abarbeiten. • • • Dazu benötigt ein Rechner eine Handlungsvorschrift, also einen Algorithmus. Um nun einem Computer eine solche Handlungsvorschrift mitteilen zu können, muss man diese als Programm codieren. Dieses Programm erlaubt es der Hardware die Anweisungen zu verstehen und nach diesen zu handeln. Der Computer zusammen mit einem solchen Programm wird daher häufig als Computersystem bezeichnet. Generell setzt sich ein Computer aus Hardware (materielle Teile), sowie Software (immaterielle Teile) zusammen. Computer, Software, Informatik • Software • • • Unter dem Begriff Software versteht man aber nicht nur Programme, sondern auch zugehörige Daten und Dokumentationen. Man unterscheidet dabei zwischen Systemsoftware und Anwendungssoftware Bit / Byte • • Das Bit ist die kleinste Informationseinheit, die verarbeitet werden kann. Ein Bit kann genau zwei Zustände haben: 1 oder 0;TRUE oder FALSE; Strom oder KeinStrom Ein Byte besteht aus 8 Bit Programmieren • Unter Programmieren versteht man… …die Tätigkeit, bei der unter Einsatz einer gegebenen Programmiersprache ein gestelltes Problem zu lösen ist. Programmieren • Ein Programm formuliert ein Problem mit einer definierten Sprache • Eine solche Sprache erlaubt es den Programmierern mit dem Computer zu sprechen und diesen aufzufordern, bestimmte Anweisungen auszuführen, um eine genau definierte Aktion ausführen zu können. Es ist dabei möglich eine Sprache zu verwenden, die der Prozessor direkt versteht. Eine solche Sprache wird dabei als Maschinensprache bezeichnet. Dabei handelt es sich um eine Sequenz von Bitfolgen, die natürlich für einen Menschen sehr schwer zu verstehen ist. Aus diesem Grund verwendet man zur Formulierung von maschinennahen Programmen meiste eine Assemblersprache, die sich so-genannter Mnemonik„s bedient, und für einen Programmierer dadurch wesentlich leichter zu verstehen und zu programmieren ist. • Ein großes Problem von solchen Assemblersprachen ist, dass diese sehr prozessorspezifisch sind und daher auf andere Systeme nicht einfach übertragen werden können. Programmieren Hello World in Assemblersprache (NASM für MS-DOS) ORG 100h ; Startoffset auf 100h setzen (Startpunkt für COM-Programme) mov ax, cs mov ds, ax ; Wert des Codesegmentregisters in Register ax übertragen ; Datensegment auf Wert von ax setzen mov ah, 09h mov dx, Meldung int 21h ; DOS-Funktion zum Schreiben von Text ; Adresse des Textes ; DOS-Funktion ausführen mov ax, 4C00h int 21h ; DOS-Funktion um das Programm zu beenden Meldung: db "Hello World" db "$" ; Unser Text ; Markiert das Ende der Zeichenkette In JAVA: public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } } Quelle: http://de.wikipedia.org/wiki/Assemblersprache#Hello_World_in_Assemblersprache_.28MASM_f.C3.BCr_MS-DOS.29 Programmieren • • • Alternativ dazu kann eine benutzernahe bzw. problemnahe Programmiersprache zum Einsatz kommen. Eine solche Sprache wird als höhere Programmiersprache bzw. problemorientierte Programmiersprache bezeichnet. In einem solchen Fall benötigt man einen Übersetzer (spezielle Software), der die einzelnen Sätze (Anweisungen) der höheren Programmiersprache in die Maschinensprache oder in eine Zwischensprache übersetzt. Ein Übersetzer, der problemorientierte Programme in maschinennahe Programme transferiert, wird Compiler genannt. Werden Programme nicht vollständig übersetzt, sondern Anweisung für Anweisung übersetzt und unmittelbar ausgeführt, spricht man von einem Interpreter. (Bekannte Interpretersprachen : BASIC, PHP,…) • Traditionelle höhere Programmiersprachen (Zahl > 200) benötigen einen Compiler, der das jeweilige Quell Programm in ein Ziel Programm compiliert. Java ist in diesem Punkt divergent, aber dazu später. Beschreibung der VO • Im Mittelpunkt der Vorlesung steht das Thema objektorientierte Programmierung unter Verwendung der Programmiersprache Java. 1. Grundlagen der Sprache 2. Objektorientierung 3. Pakete & Klassen 4. Datenstrukturen 5. Ausnahmebehandlung 6. Threads 7. Objektorientierter Entwurf 8. Grafische Benutzeroberflächen 9. Software Patterns Was wird benötigt • • • Hardware-Voraussetzungen: Zur Installation des JDK ist ein vernünftig ausgestatteter PC mit Windows oder Linux oder eine Solaris-Workstation erforderlich. Alternativ kann auch eine der vielen anderen Plattformen verwendet werden, auf die das JDK portiert wurde, beispielsweise OS/2, Mac OS X oder eines der vielen Unix-Derivate. Installation: Die J2SE 5.0, 6.0 oder 7.0 kann von SUNs Java-Server http://java.sun.com geladen werden (ca. 45 MB Download zzgl. Dokumentation). IDE: Als Integrated Development Environment (IDE) wird Eclipse 3.x empfohlen. Es kann jedoch jede beliebige Umgebung oder auch jeder beliebige Editor verwendet werden. Empfehlung unter http://www.eclipse.org zum download • JAVA Programmierhandbuch Java Was ist Java? Java • • • • • Die Programmiersprache Java verdankt ihre Popularität und weite Verbreitung ohne Frage dem ungeheuren Internet-Boom der vergangenen Jahre. Aufgrund des Internet-Bumms anfang der 2000‟er wurde es daher auch wieder etwas ruhiger um diese Sprache. Dabei ist Java und das Internet nicht unbedingt untrennbar miteinander verbunden, wie das mancherorts gerne gesagt wird - Java kann nämlich viel mehr. Die Sprache Java - oder besser Technologie - kann für die Erstellung von Applikationen für Desktop-PCs,Thin-Clients, Handheld-Geräten usw. verwendet werden. Weiters sorgt ein leistungsfähiges Komponentenmodell dafür, dass vielfältige Softwarekomponenten von Drittanbietern Entwicklungszeiten verkürzen und die Wartung vereinfachen. Es gibt eine Reihe von professionellen visuellen Entwicklungsumgebungen für Java am Markt. Als Beispiel seien hier VisualJ, JBuilder, VisualCafé, aber auch Eclipse zu nennen. Java wird und wurde zu einer verlässlichen und qualitativ hochwertigen Entwicklungsplattform, die Unternehmen eine gute Investitionssicherheit bietet. Java - Eine kurze Geschichte • • • Die Wurzeln der Programmiersprache JAVA reichen bis in das Jahr 1990 zurück. Als Java das Licht der Welt erblickte steckte das Internet, wie wir es kennen, noch sehr in den Kinderschuhen. Daher war es gar nicht die Intention der Forschungsgruppe namens Green Project eine ”Internet” Programmiersprache zu schaffen. Das Team wurde von Billy Joy und James Gosling geleitet und sollte eine einheitliche Hochsprache zur Programmierung von Software für den Electronic-Consumer-Bereich entwickeln. Angedacht war hier zunächst die Verwendung in Set-Top-Boxen für interaktives Fernsehen, Telefonanlagen und allen möglichen Haushaltsgeräten. Im Zuge der Entwicklungsarbeiten entstand die Programmiersprache Oak (Object Application Kernel). Recht bald stellte sich heraus, dass sich der Markt in diesem Bereich nicht so positiv entwickelte - und Oak drohte das Aus. Um 1993 herum wurde es etwas lauter um das Internet und bei Sun erkannte man, dass Oak sich zur Übertragung von Daten in diesem Medium bestmöglich eignete. Weiters war die Sprache bereits mit der Zielsetzung weitgehendster Plattformunabhängigkeit entwickelt worden, wodurch diese Sprache für das heterogene Umfeld des Internets absolut prädestiniert zu sein schien. Java - das Konzept dahinter • • • • • Java basiert auf einer Kombination von Compiler und Interpreter. Java-Programme werden nach der Erstellung zunächst kompiliert. Dabei wird der so genannte Bytecode erstellt. Dieser ist jedoch nicht ausführbar im Sinne eines kompilierten und gelinkten Programms, dafür aber vollkommen unabhängig von Hardware und Betriebssystemen. Man kann daher auch sagen, dass der Bytecode Informationen darüber enthält was gemacht werden soll, nicht aber wie es gemacht werden soll. Da der Bytecode nicht direkt ausgeführt werden kann, braucht er einen Vermittler. Diese Aufgabe ist zu vergleichen mit einem klassischen Interpreter. Die Aufgabe des Interpreters übernimmt in Java eine virtuelle Maschine (VM). Die VM ist eine Softwareschicht, die es für ”jede” Plattform gibt, und die für jede Plattform gesondert entwickelt werden muss. Die VM stellt die Schnittstelle zwischen dem System (der verwendeten Hardware und des Betriebssystems) und dem Bytecode dar. Java - Technologie • Es gibt eine Vielzahl von Technologien, die auf Java basieren: Applets sind kleine Programme, die zusammen mit den HTML-Seitenbeschreibungen der Websites auf einem WWW Server abgelegt sind. Der zur Ausführung des Applets notwendige Interpreter ist dabei üblicherweise im Browser integriert. Servlets sind Java-Programme, die auf Web-Servern laufen und dort dynamische HTMLSeiten erzeugen. Eng verknüpft mit dieser Technik sind Java Server Pages (JSP). Applikationen laufen außerhalb von Browsern. Damit eine Applikation gestartet werden kann, muss ein Java-Bytecodeinterpreter vorhanden sein. JavaBeans sind in Java geschriebene Softwarekomponenten. Komponentenmodelle sind wichtig, da eine weitgehende Modularisierung und Wiederverwendbarkeit ermöglicht wird. Eine Bean definiert eine klare Schnittstelle zur Umwelt. Enterprise JavaBeans erweitern das Komponenten-Konzept auf verteilte Umgebungen. D.h. die verwendeten Beans können verteilt, über ein Netzwerk erreichbar, platziert sein. Und es gibt auch Technologien die vermuten lassen, dass die auf Java basieren. JavaScript ist eine Scriptingsprache, die genau genommen mit Java gar nichts zu tun hat. So ist Java • objektorientiert • portabel und plattformunabhängig • multi-threaded • sicher und stabil • verteilt Objektorientiert • Java ist eine vollkommen objektorientierte Sprache. • In der objektorientierten Programmierung betrachtet man reale Objekte, die im Programm • • abgebildet werden sollen, als Einheiten mit bestimmten Eigenschaften und Funktionen. So kann zum Beispiel das reale Objekt AUTO im Programm durch die Eigenschaften FARBE, MOTORLEISTUNG und GESCHWINDIGKEIT beschrieben werden. Gleichzeitig gibt es Methoden (Funktionen) wie HUPEN, BREMSEN und BESCHLEUNIGEN, die das Objekt ausführen kann. Objektorientiert • • • Durch konsequente Verwendung von Objektorientierung bei der Programmierung erreicht man vor allem: eine klare Abgrenzung einzelner Aufgabenstellungen. Dies ist gerade bei großen Projekten, wo viele Personen mitwirken, von großer Bedeutung. eine leichte Wiederverwendbarkeit von einmal erstellten Programmteilen. Diese Teile können problemlos in neue Programme übernommen und integriert werden. Bei Änderungen bzw. Erweiterungen ist das Prinzip der Vererbung nützlich. • ein natürliches Software-Design. • Leichteres Verständnis des Quellcodes: Die Welt als eine Ansammlung von Objekten zu betrachten, fällt einem Menschen leichter, als sie in Datenstrukturen und Funktionensammlungen zu pressen. Portabel & Plattformunabhängig Write once, run anywhere! • • • Als portabel bezeichnet man Software, die relativ leicht an verschiedene Plattformen, also Kombinationen aus Hardware und Betriebssystem, angepasst werden kann. Im eigentlichen Sinne ist also nicht die Programmiersprache portabel, sondern die damit erstellten Anwendungen. Ein C Programm kann als portabel bezeichnet werden - es muss am Zielsystem aber ein entsprechender Compiler vorliegen. In Java programmierte Anwendungen unterliegen diesen Einschränkungen nicht. Sie sind sogar mehr als portabel - sie sind plattformunabhängig. Lediglich die Existenz einer VM wird verlangt, und schon kann das Programm, ohne neu übersetzt werden zu müssen, ausgeführt werden. Multi- Threading • • • • • thread ist das englische Wort für ”Faden”. Einfache Programme sind single-threaded. Sie bestehen aus einer Reihe von Anweisungen, die wie Perlen an einem Faden aufgereiht sind. Trotz der Tatsache, dass es Verzweigungen gibt, werden die einzelnen Anweisungen nacheinander ausgeführt. Bei einem multi-threaded Programm gibt es mehrere Fäden, denen gleichzeitig gefolgt wird. Eine Anwendung führt also mehrere Anweisungen gleichzeitig aus. In einem Rechner mit nur einer CPU können diese Prozesse natürlich nicht wirklich parallel zueinander ablaufen. In Wirklichkeit wird die CPU-Leistung in kleine Zeitscheiben aufgeteilt und den einzelnen Prozessen reihum zugeteilt. Trotzdem kann Multi-Threading auch auf einem Ein-Prozessor-System Vorteile bringen, weil die zur Verfügung stehende Rechenzeit effektiver ausgenutzt werden kann. Sicher & Stabil • Sicherheit und Stabilität sind zwei wesentliche Eigenschaften einer Anwendung. Sichere und stabile Anwendungen zu entwickeln soll und muss das Ziel eines jeden Programmierers sein. • Der Sicherheitsaspekt ist besonders bei aus dem Internet geladenen Applets wichtig. Die in Web Browsern integrierten Interpreter bzw. Appletviewer verweigern z.B. jeden Zugriff auf das lokale Dateisystem oder ungeschützte Speicherbereiche. Dieses Verfahren trägt auch den Namen Sandbox. Sicher & Stabil • Weiters überprüfen so genannte Bytecode Verifier, ob die geladenen Applets bestimmte Maßgaben erfüllen, bevor sie ausgeführt werden. • Stabilität ist für Applets als auch für Applikationen wichtig. Anwendungen sollen möglichst unbehelligt von Abstürzen laufen. • Als Beispiel für potentielle Absturzquellen von Programmen seien hier Pointer (C/C++) erwähnt, welche in Java nicht existieren. Nicht mehr benötigte Strukturen werden in Java vom Garbage Collector erkannt und entfernt. Tritt ein Fehler auf, so stürzt das Programm nicht ab, sondern es wird eine Exception ausgelöst (auch in C++ möglich). Verteilt • Unter diesem Begriff fasst man sehr global die außerordentliche Eignung Javas für die Verwendung in Netzwerken zusammen • Java implementiert bereits in den Standardbibliotheken umfangreiche Funktionen für die Nutzung von allen erdenklichen Protokollen und Diensten. Fragen & Übungen • Worin liegt der Hauptvorteil von Java Anwendungen gegenüber compilierten und gelinkten Programmen ? • Welche Nachteile gibt es? • Was bedeutet Plattformunabhängigkeit ? • Was ist die Aufgabe des Garbage Collectors ? • Was ist der Unterschied zwischen Applets und Java-Applikationen • Ist Java eine maschinennahe Programmiersprache? • Was versteht man unter einer SandBox? Informationen für die Implementierung • • • • • • Eine neue Programmiersprache lernt man nur, wenn man selbst Programme in dieser Sprache schreibt. Je mehr, desto besser. Erstellen Sie die Quelldatei mit einem ASCII-Editor. Verwenden Sie keine Textverarbeitung, denn die würde dem Code unverständliche Steuerzeichen hinzufügen. Achten Sie darauf, dass die Datei die Erweiterung .java trägt, und geben Sie ihr exakt denselben Namen wie der Hauptklasse. Übersetzen Sie das Programm mit dem Compiler javac, und geben Sie dabei den Dateinamen als Argument an. Um alle Java-Dateien in einem Verzeichnis zu übersetzen, können Sie auch *.java als Argument verwenden. Falls im Quelltext syntaktische Fehler enthalten sind, meldet der Compiler sie zusammen mit der Zeilennummer und der Quelldatei, in der sie aufgetreten sind. Am Anfang passieren leicht Fehler wie vergessene oder überflüssige Klammern oder Semikolons. Bedenken Sie auch, dass alle Schlüsselwörter kleingeschrieben werden Informationen für die Implementierung • • • • • Mitunter gibt es Fehlermeldungen/Warnungen, weil Variablen nicht initialisiert werden. Das ist in Java nicht erlaubt und wird vom Compiler mittels Datenflussanalyse überprüft. Stellen Sie den Code in einem solchen Fall geeignet um. Ignorieren Sie zunächst Warnungen, bei denen der Compiler die Verwendung von Klassen oder Methoden, die als deprecated markiert wurden, kritisiert. Derartige Programmteile funktionieren zwar meist noch, sind aber veraltet und sollten eigentlich nicht mehr verwendet werden. Gibt der Compiler gar keine Meldung aus, wurde das Programm erfolgreich übersetzt. Sie können das Programm nun mit dem Java-Interpreter java starten. Geben Sie als Argument nur den Klassennamen ohne die Erweiterung .java oder .class an. Wenn es beim Aufruf des Interpreters eine Fehlermeldung der Art NoClassDefFoundError gibt, liegt das fast immer daran, dass der Name der Klasse falsch geschrieben wurde oder dass keine oder eine falsch benannte main-Methode vorhanden ist. Hallo Welt - the very beginning /* Hello.java */ public class Hello { public static void main (String[] argument) { System.out.println ("Hello world!"); } } • • • • Das obig abgedruckte Programm enthält die Definition der Klasse Hello mit der Methode main, die das Hauptprogramm unserer ersten Applikation enthält. Diese Datei muss nun mit dem Kommando javac (so heißt der Java-Compiler des JDK) übersetzt werden. Das kann man entweder in der Kommandozeile machen, oder die integrierten Funktionen der IDE verwenden. Nach erfolgreicher Übersetzung kann das Programm gestartet werden. Dies geschieht mit dem Kommando java Hello. Wenn der Java Interpreter den Bytecode zur angegebenen Klassendatei nicht finden kann, so wird eine Fehlermeldung NoClassDefFoundError ausgegeben. Formatierung der Quelltexte • • • Es ist bekannt, dass man sich über die Formatierung von Quelltexten und die Einrückung von Deklarationen und Anweisungen streiten kann. Jeder Entwickler hat seinen eigenen Stil und kennt gute Argumente, genau diesen zu verwenden. Bei Java-Programmen gibt es einige große Lager, denen man sich anschließen kann. Im professionellen Umfeld ist man sogar meist gezwungen, sich einem vorgegebenen Stil anzupassen. • Trotzdem wollen wir folgende Regeln beachten: • Bei Klassen- und Methodendefinitionen stehen die geschweiften Klammern unterhalb der Deklarationsanweisung, und die eigentliche Deklaration ist eingerückt • Bei Kontrollanweisungen innerhalb einer Methode schreiben wir die öffnende Klammer dagegen in dieselbe Zeile wie die einleitende Anweisung • Dies gilt auch für fortgesetzte Anweisungen wie beispielsweise else oder else if • Diese Technik verwenden wir meist auch, wenn bei einem Methodenaufruf nicht alle Argumente in eine Zeile passen Namenskonventionen Wie in allen Programmiersprachen, gibt es auch in Java Konventionen für die Vergabe von Namen. Sie sind zwar nicht zwingend erforderlich, erleichtern aber das Verständnis der Quelltexte ungemein und sollten daher unbedingt eingehalten werden: Klassennamen beginnen stets mit einem Großbuchstaben. Beispiele sind String, Vector oder Hello. Besteht ein Klassenname aus mehreren Silben, können zur Steigerung der Übersichtlichkeit auch die Folgesilben mit einem Großbuchstaben beginnen. Beispiele dafür wären HelloWorld, KeyAdapter oder NoSuchMethodException. Klassennamen, die nur aus Großbuchstaben bestehen, sind unüblich. Methodennamen beginnen mit einem Kleinbuchstaben. Haben sie mehrere Silben, ist die erste oft ein Verb. Weitere Silben beginnen mit einem Großbuchstaben. Beispiele sind println, hasMoreElements oder isEnabled. Paketnamen bestehen ausschließlich aus Kleinbuchstaben. Beispiele sind java.lang, javax.swing.event oder com.solution42.util (mehrteilige Paketnamen werden durch Punkte separiert). Für Variablennamen gelten dieselben Konventionen wie für Methoden. Es ist teilweise üblich, Membervariablen mit einem Präfix wie z.B. "m_" zu versehen. (in C und C++ weit verbreitet) Grundlagen public class Compute { public static void main { int i; i } • • • } = 9 + (String[] argument) throws IOException 7; System.out.println (i); Die Zeile i = 9 + 7; sollte intuitiv verstehbar sein. Die Werte 9 sowie 7 werden mittels Additionsoperator verbunden und dann der Variablen i zugewiesen. Das Semikolon zeigt, dass die Anweisung zu Ende ist und ist somit für den Compiler wichtig, um zu erkennen, wann ein Ausdruck fertig ist und evaluiert werden kann. Das = Zeichen steht in Java nicht für das Gleichheitssymbol, sondern ist das Zuweisungszeichen. Ausdrücke wie der obige können in Java beliebig komplex sein. Es wird jedoch empfohlen Ausdrücke übersichtlich zu gestalten: Weniger (Anweisungen pro Zeile) == mehr (Übersichtlichkeit) Grundlagen - Einfache Ausgaben public class Sample { public static void main (String[] argument) { System.out.println ("1+2=" + (1+2)); System.out.println ("1+2=" + 1+2); } } • Für die ersten Schritte in einer neuen Sprache benötigt man immer I/ORoutinen, um einfache Ein- und Ausgaben vornehmen zu können. Glücklicherweise kann man in Java nicht nur grafikorientierte Programme schreiben, sondern auch auf die Standardein- und -ausgabe zugreifen. • Damit stehen für kleine Programme einfache I/O-Routinen zur Verfügung, die wie in den meisten konventionellen Programmiersprachen verwendet werden können. Grundlagen - Einfache Eingaben import java.io.*; public class Sample { public static void main { int a, b, c; BufferedReader dIn = new BufferedReader (System.in)); System.out.println ("Bitte a eingeben: "); a = Integer.parseInt System.out.println b } } • • (String[] argument) throws IOException ()); ("Bitte b eingeben: "); = Integer.parseInt c = a + b; System.out.println (dIn.readLine (new InputStreamReader (dIn.readLine ()); ("a+b="+c); Daten zeichenweise von der Tastatur zu lesen ist etwas komplizierter als die Ausgabe von Informationen und Daten. Zwar steht ein vordefinierter Eingabe-Stream System.in zur Verfügung. Er ist aber nicht in der Lage, die eingelesenen Zeichen in primitive Datentypen zu konvertieren. Statt dessen muss zunächst eine Instanz der Klasse InputStreamReader und daraus ein BufferedReader erzeugt werden. Dieser kann dann dazu verwendet werden, die Eingabe zeilenweise zu lesen und das Ergebnis in einen primitiven Typ umzuwandeln. Zahlen • Im vorigen Beispiel haben wir zwei Zahlen miteinander verknüpft. Wir haben eine Addition ausgeführt. Für uns ist es dabei ganz egal, ob wir mit ganzen Zahlen, oder mit reellen Zahlen arbeiten - nicht jedoch für den Compiler. Denn verschiedene Zahlen werden in unterschiedlichen Größenordnungen dargestellt. • Abhängig von der Darstellung wird die Zahl dann repräsentiert. • Ein Beispiel für ganze Zahlen ist: • 0 1 -1 214748324 • jedoch können in Java ganze Zahlen nicht beliebig lang sein (wie in der Mathematik) • Zahlen mit einem Vor und Nachkommateil werden in Java Gleitkommazahlen genannt. Für Gleitkommazahlen kann die wissenschaftliche Exponentenschreibweise verwendet werden. Bsp.: 0.0 1.0 -1.0 0.398282 3.1415 2.98E-10 • Etwas später mehr zu den einzelnen in Java verfügbaren Datentypen… Kommentare • • Programme, selbst in einer höheren Programmiersprache wie Java geschrieben, können manchmal von der Person, die es geschrieben hat, nicht mehr leicht gelesen bzw. verstanden werden. Schlimmer wird das Ganze, wenn eine dritte Person versucht, hinter die Geheimnisse eines fremden Programmen zu steigen. Daher ist das Dokumentieren des Codes extrem wichtig. Es erhöht die Verständlichkeit und senkt auch die Wartungszeit und die damit verbundenen Kosten. • Will man eine Anweisung kommentieren, verwendet man den einzeiligen Kommentar: Zeilen-Kommentare beginnen mit // und enden am Zeilenende. Block-Kommentare beginnen mit /* und enden mit */. Block-Kommentare können nicht geschachtelt werden! Deshalb im Programm lieber Zeilen-Kommentare anwenden, damit kann man zu Testzwecken besser ganze Blöcke auskommentieren. Dokumentations-Kommentar als Sonderfall des Block-Kommentares beginnt mit /** und endet mit */. Er wird durch das Tool Javadoc ausgewertet. Beispiel: a = b + c; // die Inhalte von Speicherzelle b und c werden addiert und a zugewiesen /* Die Zeichen // werden hier ignoriert. */ /** Ein Kommentar... /* // und jetzt das Ende */ /** /* Das ist geschachtelt */ */ Variablen • • • Im Programm war auch die Anweisung int i; zu finden. Mit dieser Anweisung wird dem Rechner mitgeteilt, dass er eine Variable mit dem Namen i erzeugen soll, und diese Variable Daten im Wertebereich von int aufnehmen können soll Diese Anweisung wird daher auch Variablendeklaration genannt. In Java ist es möglich an jeder beliebigen Stelle im Programm eine Variable zu deklarieren. Jedoch muss vor der Benutzung die Variable deklariert werden, denn es muss der Typ bekannt sein - ansonsten ist die Benützung nicht möglich. Variablen • Variablen dienen also dazu, Daten im Hauptspeicher eines Programms abzulegen und gegebenenfalls zu lesen oder zu verändern. In Java gibt es drei Typen von Variablen: Instanzvariablen, die im Rahmen einer Klassendefinition definiert und zusammen mit dem Objekt angelegt werden. Klassenvariablen, die ebenfalls im Rahmen einer Klassendefinition definiert werden, aber unabhängig von einem konkreten Objekt existieren (Schlüsselwort : static) Lokale Variablen, die innerhalb einer Methode oder eines Blocks definiert werden und nur dort existieren. Variablen • Variablen können auf zwei unterschiedliche Arten verändert werden durch eine Zuweisung : i=5; durch einen Inkrement- oder DekrementOperator: i++ // Klasse InstanzenZaehler public class InstanzenZaehler { // Klassenvariable static int counter = 0; // Instanzvariable int num; …. } Variablen - Sichtbarkeit, Lebensdauer • Die Sichtbarkeit lokaler Variablen erstreckt sich von der Stelle ihrer Deklaration bis zum Ende der Methode, in der sie deklariert wurden. Die Lebensdauer einer lokalen Variable beginnt, wenn die zugehörige Deklarationsanweisung ausgeführt wird. Sie endet mit dem Ende des Methodenaufrufs. • Falls innerhalb eines Blocks lokale Variablen angelegt wurden, sind sie bis zum Ende des Blocks sichtbar. Ihre Lebensdauer endet mit dem Verlassen des Blocks. Es ist in Java nicht erlaubt, lokale Variablen zu deklarieren, die gleichnamige lokale Variablen eines weiter außen liegenden Blocks verdecken. Das Verdecken von Klassen- oder Instanzvariablen ist dagegen zulässig. Variablen - Sichtbarkeit, Lebensdauer • Instanzvariablen werden zum Zeitpunkt des Erzeugens einer neuen Instanz einer Klasse angelegt. Sie sind innerhalb der ganzen Klasse sichtbar, solange sie nicht von gleichnamigen lokalen Variablen verdeckt werden. In diesem Fall ist aber der Zugriff mit Hilfe des this- Zeigers möglich: this.variablenname greift immer auf die Instanz- oder Klassenvariable variablenname zu, selbst wenn eine gleichnamige lokale Variable existiert. Mit dem Zerstören des zugehörigen Objektes werden auch alle Instanzvariablen zerstört/ gelöscht. • Klassenvariablen leben während der kompletten Laufzeit des Programms. Die Regeln für ihre Sichtbarkeit entsprechen denen von Instanzvariablen. Bezeichner und Namen • • Bei der Erstellung einer Applikation, eines Frameworks oder einer Toolbox wird man öfter in die Verlegenheit kommen, und Platzhalter/Variablen deklarieren müssen. Solche Platzhalter setzen sich aus folgenden Elementen zusammen: Buchstaben: a, b, c, ..., z, A, B, ..., Z (da Java eine internationale Programmiersprache ist, sind diverse landesspezifische Erweiterungen erlaubt, sollten aber wenn möglich vermieden werden.) • Unterstrich: _ Dollarzeichen: $ Ziffern: 0,1,2,...,9 Ein Bezeichner muss dabei immer mit einem Buchstaben, einem Unterstrich oder einem Dollarzeichen beginnen. Eine Ziffer ist nicht erlaubt. • Hallo_Welt _H_A_L_L_O • 17JahrBlondesHaar Kati311079 Literale • • • • Ein Literal bzw. Literalkonstante beschreibt einen konstanten Wert, der sich innerhalb eines Programmes nicht ändern kann. Ein Literal wird vom Java Compiler direkt (üblicherweise) in den Bytecode aufgenommen Literale haben, abhängig von ihrem Typ, vorgegebene Schreibweisen Es gibt folgende Arten von Literalen ✓ganze Zahlen ✓Gleitkommazahlen ✓ Wahrheitswerte ✓ einzelne Zeichen in einfachen Hochkommata („a„) ✓ Zeichenketten in Anführungszeichen (“Hallo Welt“) ✓ das so genannte Referenz-Literal (null, this, super) Trennzeichen • Der Java Compiler muss in der Lage sein, einzelne Bezeichner und Wortsymbole voneinander zu trennen. Um dies zu tun, stehen mehrere Möglichkeiten zur Verfügung. • Leerzeichen • Zeilenendzeichen (ENTER Taste) • Tabulatorzeichen • Operatoren (+, -, *, /, ...) • Kommentare • Interpunktionszeichen: . , ; )( []{} • Operatoren, sowie Interpunktionszeichen haben in Java jedoch eine sehr spezielle • • Bedeutung. Daher sollten diese nur dort eingesetzt werden, wo sie auch hingehören. Dem Punkt in der deutschen Sprache entspricht in Java das Semikolon. Befehle werden in Java immer mit einem Semikolon abgeschlossen. Fehlt dieser Abschluss, so meldet der Java Compiler einen Fehler der Form: MyProg.java:12: ‘;‘ expected Operatorsymbole • • Operatoren sind spezielle Symbole, die dazu dienen, Operanden zu einem neuen Wert zu verknüpfen. monadische Operatoren benötigen nur einen Operanden. Bsp.: ++ -- • dyadische Operatoren verknüpfen zwei Operanden und werden absolut am häufigsten verwendet. Bsp.: + - == • triadische/ternäre Operatoren verknüpfen drei Operanden. Als einziges Beispiel in Java ist der Operator ?: zu nennen: Allgemein: x = BOOL_TEST ? TRUE_FALL : FALSE_FALL Konkret: • int max = i>j ? i:j, Operatoren sind in Java mit so genannten Prioritäten versehen, wodurch gewisse Reihenfolgen bei der Auswertung eingehalten werden (Punkt vor Strich) Reservierte Wörter, Schlüsselwörter • Schlüsselwörter dürfen in Java nicht als Bezeichner verwendet werden. • Literalkonstanten (true, false, null) und eine Reihe anderer Wortsymbole sind Schlüsselwörter: •abstract •assert •boolean •break •byte •case •catch •char •class •const •continue •default •do •double •else •enum •extends •final •finally •float •for •if •goto •implements •import •instanceof •int •interface •long •native •new •package •private •protected •public •return •short •static •strictfp •super •switch •synchronized •this •throw •throws •transient •try •void •volatile •while