Lexikalische Elemente
Kommentare
Bezeichner
reservierte Bezeichner und Zeichen
Variablen
Elementare Datentypen
Operatoren
Kontrollstrukturen
Felder, Arrays
Die elementaren Bestandteile von Java Programmen sind:
White-Space: Leerraum, Tabs
Kommentare
Bezeichner
Schlüsselwörter
Literale
Interpunktionszeichen
Operatoren
Es gibt drei Arten von Kommentaren in Java:
/* Kommentar */
Für längere Kommentare über mehrere Zeilen,
praktisch auch zum vorübergehenden Herauskommentieren
von Programmteilen
// Kommentar
Ab // werden die Zeichen bis zur nächsten Zeile
ignoriert, gebräuchlich für Kommentare innerhalb
der Programmzeilen selbst
/** Kommentar */
Kommentar zur Programmdokumentation mit javadoc.
Über bestimmte Tags, z.B.
@author text
@version text
@param name Erläuterung
@return Erläuterung
lässt sich die Dokumenation sehr übersichtlich gestalten.
Namen von Variablen und Methoden etc.
beginnen mit Buchstaben, dürfen "_" und "$" enthalten.
Schlüsselwörter (key words)
Eigene Objekte und Variablen kann man beliebig nennen, bis auf folgende, von Java reservierten Worte:
abstract double int strictfp ** boolean else interface super break extends long switch byte final native synchronized case finally new this catch float package throw char for private throws class goto * protected transient const * if public try continue implements return void default import short volatile do instanceof static while
* z.Zt unbenutzt, ** neu in Java 2
( ) { } [ ] ; , . = - + * / % < > ! ? & | ~
Daneben gibt es eine Reihe von Methodennamen mit speziellen
Bedeutungen (z.B. main()
oder run()
).
Sie werden in der Regel durch Interfaces vorgeschrieben.
Eine Ausnahme ist die Methode main()
.
In Java sind die primitiven Datentypen architektur-unabhängig definiert. Eine Zusammenstellung befindet sich in Abbildung 1.3. Der Begriff `atomar' wird bei Mulit-threaded Programmen benötigt.
Datentyp | Inhalt | Größe | atomar |
---|---|---|---|
boolean | true oder false | 1 bit | ja |
char | Unicode Zeichen | 16 bits | ja |
byte | signed integer | 8 bits | ja |
short | signed integer | 16 bits | ja |
int | signed integer | 32 bits | ja |
long | signed integer | 64 bits | nein |
float | IEEE754 float | 32 bits | ja |
double | IEEE754 double | 64 bits | nein |
String | Zeichenkette | beliebig | nein |
Objekt-Referenz | Zeiger, Pointer | null oder Referenz | ja |
Typ | Art (Bereich) |
---|---|
ganze Zahlen | |
byte | 8-bit Integer mit Vorzeichen (-128 bis 127) |
short | 16-bit Integer mit Vorzeichen (-32.768 bis 32.767) |
int | 32-bit Integer mit Vorzeichen (-2.147.483.648 bis 2.147.483.647) |
long | 64-bit Integer mit Vorzeichen (-9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807) |
reele Zahlen | |
float | 32-bit IEEE 754 Fliesskomma (-3.40282347e+38 bis 3.40282347e+38) |
double | 64-bit IEEE 754 Fliesskomma (-1.7976931348623157e+308 bis 1.7976931348623157e+308) |
andere Typen | |
char | 16-bit Unicode character (65536 Zeichen). |
boolean | Boolscher Wert (wahr oder falsch) |
Die Größe der Datentypen ist unabhängig vom Rechnersystem und der Java-Implementierung!
Beispiel:
public class PrimitivTypen { // lexikalische Typen sind int und double // andere direkte Wertzuweisungen müssen // "gecastet" werden z.B.: byte b = (byte)37; short s = (short)37; int i = 37; long l = 37L; float f = 0.37F; double d = 0.37; char c = 'K'; boolean b = true; }
Es gibt unter anderem folgende drei Arten von Variablen:
lokale Variablen:
werden lokal innerhalb eines {...}-Blocks (z.B. Methode)
definiert und sind nur dort verfügbar.
Objekt-Variablen:
werden in Klassen definiert und gehören zum
erzeugten Objekt
Klassen-Variablen:
werden in Klassen definiert und sind ohne erzeugtes Objekt
verwendbar
Zur Verknüpfung von elementaren Datentypen:
postfix operators [] . (params) expr++ expr-- unary operators ++expr --expr +expr -expr ~ ! creation or cast new (type)expr multiplicative * / % additive + - shift << >> >>> relational < > <= >= instanceof equality == != bitwise AND & bitwise exclusive OR ^ bitwise inclusive OR | logical AND && logical OR || conditional ? : assignment = += -= *= /= %= &= ^= |= <<= >>= >>>=
Beispiel:
public class Operatoren { public void numericalops() { int n = 43; n += 7; // ist eine Abkuerzung von n = n + 7; // dies funktioniert auch mit -, /, >>, etc. n = n * 2; // verdoppelt n n = n / 2; // teilt n ganzzahlig durch 2 n = n % 2; // Rest der ganzzahligen Division float f = n / (float)2; // liefert das float- // Divisionsergebnis } public void logicalops() { boolean bool = true && false; // bool ist false bool = true || false; // bool ist true bool = true == false; // bool ist false bool = false != true; // bool ist true bool = 4 >= 3; // bool ist true bool = 4 <> 4; // bool ist false } public void difficultops() { // definiert ein int-Array mit 8 Eintraegen int array[] = new int[8]; if (array[0]++ < 0); // ist gleichbedeutend mit if (array[0] < 0); array[0] = array[0] + 1; if (--array[1] == 2); // ist gleichbedeutend mit array[1] = array[1] - 1; if (array[1] == 2); boolean bool = true; bool = !bool; // ! nimmt eine logische Negierung vor // bool ist jetzt gleich false int conditional = bool == true ? 3 : -2; // conditional ist jetzt -2 } public void bitwiseops() { int i = 3; i = i << 1; // i ist jetzt 6 i = i & 7; // i ist jetzt 6 i = i | 3; // i ist jetzt 7 } }
Kontrollstrukturen dienen dem Ausführen von Programmteilen in Abhängigkeit von sich ändernden Bedingungen.
Statement Keyword decision making if-else, switch-case loop for, while, do-while miscellaneous break, continue, label:, return
Schleifen und bedingte Anweisungen
Java hat die üblichen auch von C und C++ bekannten while-, do- und for-Schleifen-Konstrukte.
if (condition) { statements } else { statements } while (condition) { statements } do { statements } while (condition); for (int i=0; i < end; i++) { statements } switch (var) { case a: { statements } case b: { statements } ... default: { statements } }
break und continue können analog zu C/C++ in einer Schleife benutzt werden.
Beispiel:
public class Kontrollstrukturen { public void decision() { int variable = 2; if (variable > 1 && variable == 2) { variable = variable - 1; } else { variable = variable + 1; } switch (variable) { case 0: case 1: // variable ist 0 oder 1 break; case 2: variable = variable * 2; break; default: // variable ist nicht 0, 1 oder 2 } } public void loop() { // dreimal die selbe Schleife for (int index = 0; index < 4; index = index + 1) { // tue irgendwas 4 mal } int index = 0; while (index < 4) { index = index + 1; } index = 0; do { index = index + 1; } while (index < 3); } public void miscellaneous() { int i = 0; while (1 > 0) { i = i + 2; if (i > 5) break; // verlaesst die while-Schleife continue; // faengt sofort wieder am // Schleifen-Kopf an } return; // beendet die Methode sofort } }
Ein Array, d.h. einen Vektor oder eine Matrix, kann man ebenfalls durch new erzeugen.
byte[] buffer = new byte[4096]; byte[] data = new byte[4096]; int[][] plot = new int[64][64]; ... Date[] ds = new Date[16];
Auf die Elemente eines Arrays kann über ihren Index zugegriffen werden.
for (int i=0; i < buffer.length; i++) buffer[i] = data[i];
In der length Variablen eines Array Objekts steht die Information über die Länge bereit.
Bemerkung:
Java erlaubt (aus Gründen der Kompatibilität zu C/C++) auch die
Notation byte buffer[] = new byte[4096]
.
Wir werden davon aber keinen Gebrauch machen.
Erstellt unter Verwendung von Vorlesungsunterlagen von Dr. V.-H. Winterer, Universität Freiburg, Rechenzentrum.
© Universität Mannheim, Rechenzentrum, 2000-2002.
Heinz KredelLast modified: Mon Nov 19 23:02:32 MET 2001