Java und C++ im Vergleich
Java basiert auf C++
viele Grundelemente gleich oder ähnlich
Erweiterungen (Grafik, ...)
Einschränkungen aus Sicherheitsgründen (keine Pointerarithmetik, ...)
konsequente Objektorientierung
wichtige Änderungen bei Feldern, Parameterübergabe, ...
Das typische Hallo-Welt-Programm: Hallo.java
Java als eigenstängige Sprache
Programme werden i.A. in eine portable Zwischensprache übersetzt und auf dem Zielsystem interpretiert
zur Laufzeit werden ggf. die innersten Schleifen in Maschinencode übersetzt
Java als Sammlung von Klassenbibilotheken
es können leicht fensterorientierte Programme erstellt werden, die sowohl z.B. unter X-Windows, als auch unter Microsoft Windows, Mac OS, etc. ausgeführt werden können
Elemente: Fenster, Menüs, Ereignisgesteuerte Programme etc.
Was versteht man unter Applets?
kleine Programmstücke, die nicht selbständig ausgeführt, sondern in einem Internet-Browser wie Firefox oder MS-Internet-Explorer als Komponenten aufgerufen werden
-> sie werden heutzutage kaum benutzt und von vielen Browsern nicht mehr unterstützt
Was versteht man unter JavaScript?
Skriptsprache ähnlich zu Java
Befehlstexte werden direkt in HTML-Dokumente für das Internet eingefügt
Spracheigenschaften von Java
portabel auf Quelltextebene (standardisierte Sprache und Bibliotheken)
portabel auf Codeebene (maschinenunabhängiger Bytecode mit Interpreter)
einfache Sprache, auf Basis bekannter Sprache (Ähnlichkeit zu C++)
sicher (bewusste Einschränkungen beim Umfang)
multi-threaded (ermöglicht parallele Ausführung von Prozessen in Programmen)
verteilte Anwendungen (Internet)
einfaches Erstellen von Window-Programmen (Klassenbibliotheken)
Unterschiede zwischen Java-Quelltext und Java-Bytecode
Java-Quelltext: in der Programmiersprache geschriebene, textförmige Beschreibung des Programms
-> hat die Endung .java
Java-Bytecode: durch Compilierung des Quelltextes entstande hardwareunabhängiger Zwischencode
-> hat die Endung .class
Unterschiede zwischen Java-Compiler und Java-Interpreter
Java-Compiler: erstellt aus dem Quellcode das eigentliche Programm in Bytecode
Java-Interpreter: interpretiert den Bytecode und führt das Pogramm aus
Bezeichnungen von Java
Algorithmus allgemeine Definition
Präzise Beschreibung einer Berechnung oder allgemein eines Verfahrens
Eigenschaften eines deterministischer Algorithmus
Finitheit: das Verfahren muss durch einen endlichen Text oder eine endliche Grafik beschrieben werden
Ausführbarkeit: jeder Schritt des Verfahrens muss eindeutig ausführbar sein
Determinismus: der nächste anzuwendende Schritt des Verfahrens muss zu jedem Zeitpunkt eindeutig definiert sein
dynamische Finitheit: das Verfahren darf zu jedem Zeitpunkt nur endlich viel Speicherplatz benötigen
Terminierung: das Verfahren muss nach endlich vielen Schritten enden
spezielle Varianten des determinisitschen Algorithmus
in manchen Fällen sind Ausnahmen sinnvoll!
keine Terminierung: mathematisches Iterationsverfahren: konvergiert gegen Lösung
keine Terminierung: Betriebssystem eines Rechners
keine Terminierung: Steuersoftware eines Geräts (z.B. Handy, Smart Phone, Auto) oder Fertigungsprozess (z.B. in Chemiewerk) sollen dauerhaft laufen
kein Determinismus: Verwendung einer (echten) Zufallszahl, unvorhersehbare zeitliche Abläufe in Parallelrechner oder Mehrkernprozessor
Gegenbeispiele und Beispiele für Algorithmen
der Euklidische Algorithmus:
Algorithmus “Sieb des Eratosthenes”:
Beispiele für keine Algorithmus:
die Wertzuweisung
Variable erhält den Wert der rechten Seite
Beispiele:
x = 27;
y = 3 * x + 2;
Eingabeanweisung
Variable erhält einen eingelesenen Wert
i = sc.nextInt();
x = sc.nextDouble();
Ausgabeanweisung
der Wert wird ausgegeben
System.out.println ("Bitte x eingeben: ");
System.out.println (y);
System.out.println ("Ergebnis = " + y);
Was ist wichtig für Variabeln?
Alle verwendeten Variablen müssen zuvor definiert werden!
int i, j, k;
double x, y;
Grundstruktur eines Java-Programms (der typische Aufbau)
Flussdiagramme
kompliziertere Algorithmen müssen formal beschrieben werden!
Flussdiagramme / Programmablaufpläne Anweisungen in Rechtecken / Rauten / Parallelogrammen
Reihenfolge der Anweisungen wird mit Pfeilen angezeigt
in DIN 66001 genormt
kann unübersichtlich werden schwierig zu bearbeiten
Beispiel für ein Fussdiagramm
Gib 1 bis 39 und 61 bis 100 aus:
Struktogramme/Nassi-Shneiderman-Diagramme
kompliziertere Algorithmen müssen formal beschrieben werden
Alternative zu Flussdiagrammen
rechteckige Kästen enthalten elementare Anweisungen
-> die Kästen können aneinander gereiht und geschachtelt werden
von Isaac Nassi und Ben Shneiderman entwickelt (1972/73, USA)
in DIN 66261 genormt
Struktogramme: Aufbau und Syntax
bei einer Folge von Anweisungen:
bei einer einfachen Auswahl von Anweisungen:
bei einer zweiseitigen Auswahl von Anweisungen:
bei einer Wiederholung von Anweisungen:
oder:
bei einer Auswahl von Anweisungen:
beim Aufruf einer Methode:
bei Zusammensetzung geschachtelter Anweisungen:
Was ist UML?
steht für Unified Modeling Language
weitere Alternative zu Struktogrammen
ist eine weit verbreitete Möglichkeit Programmabläufe strukturiert darzustellen
etablierter Industriestandard
bietet viele verschiedene Möglichkeiten, Programmabläufe darzustellen
Darstellung kann auf verschiedenen Ebenen (Prozessebene, Klassenebene, ...) erfolgen
Erklärung von Klassendiagramm
jede Klasse wird durch einen Kasten beschrieben
-> oben steht ihr Name, in der Mitte ihre Attribute und unten die Methoden
Beispiel für den Aufbau:
Klassen werden mit folgenden Symbolen in Relation zueinander gestellt:
Beispiel für ein Klassendiagramm
Kommentare in Java
Schachtelung von Kommentare in Java
Kommentare können nicht beliebig geschachtelt werden und dürfen nicht in Namen und Wortsymbolen stehen!
Dokumentationskommentare
Dokumentationskommentare werden wirksam, wenn man die Java-Datei mit dem im JDK enthaltenen Programm javadoc bearbeitet
javadoc legt mehrere Webseiten (html-Dateien) an, die zusammen mit den class-Dateien als Dokumentation ausgeliefert werden können
folgende Tags werden dabei berücksichtigt:
Bezeichner für Klassen, Methoden, und Variablen
Bezeichner (auch geläufig als Namen) bestehen aus beliebig langen Folgen von Unicodebuchstaben und Ziffern
ein Bezeichner beginnt mit einem Buchstaben, es folgen Buchstaben oder Ziffern
A bis Z, a bis z, _ und $ sind Unicodebuchstaben,
0 bis 9 sind Unicodeziffern
Groß- und Kleinbuchstaben werden strikt unterschieden
nicht erlaubt sind alle Wortsymbole und die Literale true, false und null
Konventionen für die Bezeichner
Klassen: Anfangsbuchstabe groß, Rest klein, Wortanfänge groß,
z.B. HalloWelt
Methoden und Variablen: Anfangsbuchstabe klein, sonst identisch mit Konventionen für Klassennamen,
z.B. main, xWert, piMalDaumen
Konstanten: lauter Großbuchstaben,
z.B. MAX, DIM
White-Space-Zeichen
unter dem Begriff werden folgende Zeichen zusammengefasst:
Leerzeichen
Zeilenendezeichen
Tabulator
Seitenvorschub
erhöhen die Lesbarkeit des Quelltextes und werden zum Trennen von Wortsymbolen, Bezeichnern, usw. benötigt (z.B. public class Hallo)
-> ansonsten besitzen sie keine Wirkung
Wortsymbole (Liste von Literalen)
Interpunktionszeichen
dienen zur Trennung, Abschluss und Zusammenfassung von Literalen, Bezeichner und Anweisungen
-> sie dürfen nur da eingesetzt werden, wo sie auch hingehören
die 36 Java Operatoren
import-Anweisungen
werden verwendet, um Bibliotheken, die in separaten Klassen ausgelagert sind, der eigenen Klasse zugänglich zu machen
Achtung: import–Anweisungen müssen vor der Definition der Klasse erfolgen!
Form eines Programmes
wesentliches Konzept von Java ist die objektorientierte Programmierung
-> daher muss die main-Methode in einer Klasse definiert sein
für Applikationen muss genau eine Methode der folgenden Form definiert sein - dies ist das Hauptprogramm:
typische Anweisungen sind Wertzuweisungen der Form:
Variable = Ausdruck
ebenfalls typisch: die Ausgabe von Zeichenketten auf dem Bildschirm
Literale
als Literal bezeichnet man in Programmiersprachen eine Zeichenfolge, die zur direkten Darstellung der Werte von Basistypen (z. B. Ganzzahlen, Gleitkommazahlen, Zeichenketten) definiert bzw. zulässig ist
Datentypen und Literalkonstanten
Datentypen sind vorgegebene oder selbst definierte Mengen von Werten, z.B. ganze Zahlen, Zeichen, Zeichenketten
Literalkonstanten sind Darstellungen dieser Werte im Programmtext
Ganzzahlige Datentypen
folgende Datentypen gibt es:
Stellenwertsystem bei ganzzahligen Konstanten
Darstellung von ganzzahligen Konstanten
in Java dürfen ganzzahlige Konstanten zur Basis 10 (dezimal), 8 (oktal) oder 16 (hexadezimal) dargestellt werden; ab Java 7 auch zur Basis 2 (binär)
als Ziffern für Basen b > 10 werden Buchstaben verwendet:
A = 10, B = 11, ..., F = 15, ..., Z = 35
Suffixe l und L
der Unterstrich für die optische Gliederung von ganzzahligen Konstanten
ab Java 7 können Zahlen durch das Zeichen _ zwischen den Ziffern zur besseren Lesbarkeit gegliedert werden
die Umrechnung von Stellenwertsystemen
(allgemeines Verfahren: Hornerschema)
Gleitkommatypen
stellen eine Teilmenge der rationalen Zahlen dar
sind heute fast immer nach dem IEEE-Standard 754 implementiert
englische Bezeichnung floating point number weist auf die englische Schreibweise mit einem Dezimalpunkt hin - im Deutschen sind Dezimalkommas üblich
-> trotz der deutschen Bezeichnung „Gleitkommazahl“ werden die Nachkommastellen in Java-Programmen mit einem Punkt getrennt!
Aufbau Gleitkommazahl
besteht aus:
Mantisse (Ziffernfolge, ggfs. mit Dezimalpunkt)
Exponentenangabe (e bzw. E, ggfs. Vorzeichen, Ziffernfolge)
-> Gleitkommakonstanten müssen einen Dezimalpunkt oder eine Exponentenangabe enthalten. Andernfalls ist es eine ganzzahlige Konstante!
optische Gliederung bei Gleitkommazahlen
ab Java 7 können Zahlen durch das Zeichen “_ “ zwischen den Ziffern zur besseren Lesbarkeit gegliedert werden:
Suffixe f, F und d, D
die Suffixe f, F legen eine Konstante vom Typ float an
die Suffixe d, D entsprechend eine Konstante vom Typ double
zum Bespiel 1.2f, 1.2d.
-> ohne Suffix ist die Konstante vom Typ double
Überlauf beim Gleitkommatypen
tritt Überlauf ein, so wird mit ± Infinity weitergerechnet!
bei einem mathematisch sinnlosen Ergebnis (z.B. 0/0, ∞ − ∞, 0 ∗ ∞) wird NaN (Not a Number) als Ergebnis eingesetzt
-> damit kann das Programm formal fortgesetzt werden
Datentyp char
Zeichen zählen in Java ebenfalls zu den numerischen Datentypen!
-> mit ihnen darf gerechnet werden und das Ergebnis ist dann ein int
char ist der einzige vorzeichenlose numerische Datentyp
Zeichenkonstanten werden in Hochkommata geschrieben
Escape-Sequenzen und Unicode-Escapes
Codierung von speziellen Zeichen
eine Liste aller Unicode-Zeichen gibt es unter unicode.org/charts
American Standard Code for Information Interchange (ASCII) Tabelle
Datentyp String
dient zur Speicherung (beliebig langer, endlicher) Zeichenketten
String zählt zu den Referenztypen!
-> hat Auswirkungen bei manchen Operationen
Beispiele für Stringkonkatenation
Zusätze zum sog. String
"5" ist nicht vom Typ char, sondern eine Zeichenkette und damit vom Typ String! -> mit Strings kann nicht gerechnet werden
tritt die gleiche Zeichenkette mehrmals auf, so wird diese i.a. nur einmal gespeichert:
Beispiel für die Ausgabe von einem String
Boolscher Typ
boolsche Variablen speichern Wahrheitswerte, also z.B. Ergebnisse von Vergleichen
der Datentyp lautet “boolean”
die Größe ist 1 Bit.
es können nur die Wahrheitswerte true (wahr) und false (falsch) angenommen werden
Referenztypen
Referenztypen treten auf bei Objekten (Klassen, Feldern, Strings)
sie verhalten sich anders als die bisher genannten Grundtypen / elementaren Typen
eine Referenzvariable enthält nicht die Daten, sondern nur eine Referenz darauf (d.h. Adresse, Pointer, Verweis)
der Speicherbedarf ist abhängig vom System entweder 32 oder 64 Bit
null bezeichnet die Nullreferenz, die auf kein Objekt verweist
der void-Typ
ist ein Pseudotyp und tritt bei Methoden auf
besitzt eine Methode keinen Rückgabewert, so wird void, d.h. „nichts“ als Ergebnis zurückgegeben
Fazit/Zusammenfassung von Kapitel 4
Variablen und Konstanten
Variablen sind Elemente eines Programms, in denen veränderliche Werte abgespeichert werden
in Konstanten werden unveränderliche Werte abgespeichert
Variablendeklaration
Speicherstellen können Variablen, d. h. veränderliche Werte oder Konstanten, also unveränderliche Werte, darstellen
diese, wie auch Funktionen, müssen vor dem ersten Auftreten vereinbart, d. h. einem Datentyp zugeordnet werden!
bei der Definition werden Name, Typ und Speicherbedarf einer Größe festgelegt
die Definition der Variablen erfolgt durch eine Typangabe, der für einen der Datentypen steht
-> dabei wird dem Typ entsprechender Speicherplatz reserviert
die darauf folgende Namensliste ist eine kommaseparierte Liste von Bezeichnern
ein Modifizierer ist z. B. static
Initialisierung von Variablen
die Initialisierung der Variablen erfolgt durch eine Wertzuweisung:
der Ausdruck muss vom gleichen Typ wie der Name sein (oder durch eine implizite Typumwandlung (Kap.6.6) in den Typ des Namens umgewandelt werden können)
der Ausdruck muss auswertbar sein, darf also keine nicht initialisierten Variablen enthalten
bereits initialisierte Variablen können durch erneute Wertzuweisungen verändert werden
symbolische Konstanten
das zusätzliche Wortsymbol final bewirkt, dass der Wert der „Variablen“ nicht verändert werden darf
-> daraus folgt, dass symbolische Konstanten initialisiert werden müssen oder durch eine Wertzuweisung einmalig einen Wert erhalten
Achtung: das Wortsymbol “const” wird zur Zeit von Java nicht unterstützt!
Fazit zu Variablen
Wofür sind arithmetische Ausdrücke?
für die Umsetzung von mathematischen Formeln mit Operatoren, Standardfunktionen, ...
Arithmetische Operatoren (einstellige und zweistellige Operatoren)
einstellige Operatoren: Vorzeichen sowie die Inkrement- und Dekrementoperatoren; brauchen nur ein Argument (beziehen sich nur auf eine Variable)
zweistellige Operatoren: Arithmetische Operatoren; brauchen immer zwei Argumente
ganzzahlige Division und Gleitkommadivision
Inkrement- und Dekrementoperatoren (Präfix- und Postfixvarianten)
der Inkrementoperator ++ erhöht den Operanden um Eins
der Dekrementoperator -- vermindert den Operanden um Eins
-> beide Operatoren können sowohl vor als auch nach dem Operanden stehen - ihre Wirkung auf den Operanden ist dabei gleich, allerdings unterscheiden sich die beiden Varianten im Wert des Ausdrucks:
bei der Präfixvariante wird zuerst der Wert des Operanden um eins verändert (erhöht bzw. vermindert) und erst danach der Wert des Ausdrucks zugewiesen
bei der Postfixvariante geschieht dies in genau umgekehrter Reihenfolge
der Zuweisungsoperator
der Zuweisungsoperator = steht zwischen einer Variablen (linke Seite) und einem Ausdruck (rechte Seite)
der Ausdruck wird ausgewertet und der Wert anschließend der Variablen zugewiesen
-> da es sich um einen Operator handelt, erhält der gesamte Ausdruck ebenfalls den ermittelten Wert
Mathematische Standardfunktionen
mathematische Standardfunktionen sind in Java in der Klasse java.lang.Math enthalten
diese Klasse braucht nicht importiert zu werden, sie wird standardmäßig geladen
allerdings muss bei der Verwendung von Methoden und Konstanten jeweils der Klassenname Math vorangestellt werden
seit Java 5 geht auch import static java.lang.Math.*; danach kann Math. weggelassen werden.
Tabelle der Standardfunktionen in java.lang.Math
Fazit von einfachen Ausdrücken
Ausdrucksanweisung
(einfache) Ausgabeanweisungen
(einfache) Eingabeanweisungen
zu Beginn eines jeden Quelltextes mit Eingabe muss mit Hilfe der import-Anweisung die Klasse java.util.Scanner; bekannt gemacht werden:
zusätzlich muss ein Scanner erzeugt werden und die Eingabe sollte auf den US-Stil mit Dezimalpunkt umgestellt werden
-> dies geschieht mit folgenden Zeilen vor der ersten Eingabe:
Fazit von einfachen Anweisungen
Kombinierte Zuweisungsoperatoren
Zuletzt geändertvor 3 Monaten