byte, short, int, long
)
und reellen (float, double
) Zahlen entsprechen.
Jede Variable eines solchen Datentyps
beansprucht bei ihrer Allokierung (Initialisierung)
einen Speicherplatz fester Größe,
die in Byte gemessen wird. Dadurch kann es nur
endlich viele Zahlen des jeweiligen Typs geben.
int
-Zahl verwendet.
Daher gibt es hiervon genau 2^(32) Zahlen, nämlich die Zahlen
-2^(31) bis 2^(31)-1.
8 Byte werden für eine double
-Zahl verwendet. Diese
werden intern als Gleitpunkt-Dualzahlen dargestellt mit 11 Bit
für den Exponenten, 1 Bit für das Vorzeichen und
verbleibenden 52 Bit für die Mantisse. Es gibt insgesamt 2^64
double
-Zahlen, die ungleichabständig auf dem
Zahlenstrahl verteilt sind. In der Numerischen Mathematik lernen Sie
das mit den double
- und float
-Zahlen
verbundene Konzept der Gleitpunktzahlen und der damit
verbundenen Rundungsfehler.
Nicht primitive Datentypen sind Zeichenketten, Felder und alle Klassen. Hierzu später mehr.
Die Java-spezifischen Schlüsselworte ("Terminalsymbole") sind alle fett hervorgehoben, die besonders wichtigen sind rot. In der folgenden Erläuterung sind die Termini, die die Grammatik erklären ("Nichtterminalsymbole"), grün .1 class Bsp1{ 2 static void main(String[] args){ 3 double x,y,z; 4 x=3.1675; y=-2.4567; 5 z=x+y; 6 System.out.println(z); 7 }//Ende main() 8 }//Ende class
Das Programm besteht aus einer einzigen Klasse (class) mit Bezeichner
Bsp1
: Es wird ausführbar durch die Methode main()
, deren
Programmzeile 2 hier noch nicht erläutert wird. Man spricht auch
von einer Applikationsklasse. Dieses Programm hat mit OOP nichts zu
tun. Dennoch hilft es - wie auch die folgenden Beispiele -, mit den
wichtigsten Sprachelementen vertraut zu machen. Später werden wir
Klassen kennenlernen, von denen "Instanzen" in Form von Objekten gebildet werden.
Wiederholt werden soll eine
Bsp1
) enthält, mit
dem Bezeichner der Klasse übereinstimmen (also
hier Bsp1.java
heißen).
Zur Strukturierung der Klasse Bsp1
achte man auf
(ineinandergeschachtelte) Blöcke
, die durch geschweifte Klammern {
und } eingeschlossen werden und
Anweisungen enthalten.
Der größte Block ist der, der die Klasse umfasst. Dann
kommt der Teilblock zur Methode main
.
Kommentare (in einer Zeile)
werden durch zwei Slashs (//
) eingeleitet.
Die Zeile 3 enthält Deklarationen
der Variablen mit Namen (Bezeichner) x, y
und
z
vom Typ double
. In Zeile 4 stehen zwei
Wertzuweisungen, in Zeile 5 wird
z
ein Wert mit Hilfe eines arithmetischen Operators + (Addition)
zugewiesen. Man kann das hier verwendete Gleichheitszeichen auch als
Zuweisungsoperator bezeichnen, wobei
links davon eine Variable und rechts davon ein Ausdruck steht. System.out.println() in
Zeile 6 ist eine von Java gelieferte Methode, die das, was innerhalb
der runden Klammern steht, auf den Bildschirm ausgibt. Später
werden wir sehen, dass stets Zeichenketten (Schlüsselwort
String
) auf dem Bildschirm ausgegeben werden. Intern wird
die double
-Zahl in eine Zeichenkette umgewandelt.
Grundsätzlich muss jede Variable in einem Programm deklariert
werden: ihr Name (Bezeichner) und ihr Typ werden hierdurch
festgelegt. Die Deklaration kann auch direkt mit einer
Wertzuweisung verbunden werden:
ersetzt die alten Zeilen 3-5.
3 double x=3.1675, y=-2.4567, z=x+y;;
Jede Anweisung wird stets mit einem Semikolon ; abgeschlossen. Kommata dienen zur Auflistung wie in der eben modifizierten Zeile 3.
Weitere arithmetische Operatoren (Subtraktion, Multiplikation und
Division) sind -, *, /.Der Potenzoperator wird in Java durch die
Methode pow() der Klasse Math bereitgestellt:
In Zeile 6 kann die Ausgabe benutzerfreundlicher gestaltet werden:
z=Math.pow(x,y);
Da die
6 System.out.println("Ergebnis: z="+z);
double
-Zahl z intern in eine Zeichenkette umgewandelt wird,
werden hier Zeichenketten "addiert" (verkettet), der Operator + ist
also nicht nur ein arithmetischer Operator.
double
-Zahlen können auch in der Gleitpunktform dargestellt
werden: So ist double x=3.132 E-6;
gleichwertig mit
double x=0.000003132;
. Es steht E-6
für
10 hoch -6.
Mit double
-Zahlen wird mit einer etwa 15-stelligen Genauigkeit
gerechnet. Ist man aus Mangel an Speicherplatz mit einer geringeren
Genauigkeit zufrieden, so kann man float
-Zahlen
verwenden.
short,
byte
erfasst.
Die arithmetischen Operatoren können selbstverständlich auch
auf int
-Zahlen angewendet werden. Aufpassen muss man nur bei der
Division. So ergibt
den Wert
int i=7, j=3, k=i/j;
k=2
(die größte ganze Zahl, die
kleiner gleich dem Quotienten ist).
erhält x den Wert 2. Erstint i=7, j=3; double x=i/j;
leistet das Gewünschte. Man nennt das Vorschalten eines Datentyps in runden Klammern wie inint i=7, j=3; double x= (double) i/j;
(double)
Casting,
welches die Konvertierung eines Datentyps in einen anderen bewirkt.
Erwähnt werden sollte auch der binäre Modulo-Operator
%, der durch k=i%j
im
Falle von int
-Zahlen i, j, k
den
ganzzahligen Rest bei der Division von i
durch
j
liefert.
die Werteint i=7, j=3; i++; j--; System.out.println("i="+i+" j="+j);
i=8
und j=2
. Gleichwertig, aber
ein wenig länger ist
oder aber auch (durch Verwendung weiterer Kurzoperatoren +=, -= )int i=7, j=3; i=i+1; j=j-1;
Die Kurzoperatoren ++, -- kann man einer Variablen voran- oder nachstellen. Der Unterschied wirkt sich nur aus, wenn man Ausdrücke der Formint i=7, j=3; i += 1; j -= 1;
int
a=i++
oder int b=++i
verwendet. Näheres
finden Sie in Lehrbüchern.
Sie stehen stets in runden Klammern. Beachten Sie, dass zwei Gleichheitszeichen zum Vergleich zweier Zahlen verwendet werden, d.h. == ist ein (zweistelliger) Vergleichsoperator (relationaler Operator). Das Ergebnis sowohl der Vergleichs- als auch der logischen Operatoren ist stets vom Typboolean w=(9==Math.pow(3,2));
boolean
. Während bei
den Vergleichsoperatoren die Argumente Zahlen sind, sind es bei den
logischen Operatoren ebenfalls logische Variable.
Der (einstellige) logische Operator !
verneint. Daher testet != auf
Ungleichheit.
ergibt fürint x = 3; boolean w = !((8< x) | (x != 1));
w
den Wert false
.