Objektorientierte Programmierung OOP
KE 2 Datentypen und Kontrollstrukturen; Begriffe, Beispiele und Definitionen
KE 2 Datentypen und Kontrollstrukturen; Begriffe, Beispiele und Definitionen
-
- 1 / 90
-
Flashcards
Datentyp Ein Datentyp (engl. datatype) ist eine Menge von Werten und eine Menge von Operatoren, um diese Werte zu verknüpfen, zu vergleichen oder ineinander zu überführen.
Begriff: primitive Datentypen sind z.B. int oder char.
Wie werden diese Typen noch bezeichnet?
elementare und einfache Datentypen
Begriff: ganze Zahlen
Welche Typen gibt es und wie ist deren Wertebreich?
-byte; -2hoch7, ..., 0, ..., 2hoch7-1; -128, ..., 127
-short; -2hoch15, ..., 0, ..., 2hoch15-1; -32768, ..., 32767
-int; -2hoch31, ..., 0, ..., 2hoch31-1; -2147483648, ...,2147483647
-long -2hoch63, ..., 0, ..., 2hoch63-1; -9223372036854775808L,..., 9223372036854775807L
Literale (engl. literal) sind Folgen von Zeichen, die Werte symbolisieren. [JLS: § 3.10]
Diese Kennzeichnungen wurden bei Java eingeführt, um eine eindeutige Interpretation von Literalen zu gewährleisten. Anderenfalls könnte z. B. das Literal 123 nicht nur für den Dezimalwert 123, sondern auch für den Dezimalwert 83 stehen, wenn 123 als Oktalzahl aufgefasst wird, oder den Dezimalwert 291 darstellen, wenn 123 als Hexadezimalzahl aufgefasst wird.
Begriff: Gleitkommazahl
• Gleitkommazahlen mit einfacher Genauigkeit vom Typ float
• Gleitkommazahlen mit doppelter Genauigkeit vom Typ double
Gleitkommazahlen sind vom Typ double, falls kein Buchstabe (d, D, f, F) am Ende des Literals angegeben ist.
Die Präzision von Gleitkommazahlen ist beschränkt. Bei float-Zahlen beträgt die Genauigkeit ungefähr sieben Dezimalstellen, bei double-Zahlen ungefähr 15 Dezimalstellen. Operationen auf Gleitkommazahlen können die Genauigkeit weiter reduzieren. Betrachten Sie daher Gleitkommazahlen stets als Näherungen.
Beispiel: Rundungsfehler
Das Ergebnis der Division 10000000000.0 / 3.0 ist 3.3333333333333335E9.
Das Ergebnis der Multiplikation 100.0 * 4.35 ist 434.99999999999994.
Definition: Operator
Ein Operator führt eine Funktion (wie Negation, Addition, Subtraktion, Multiplikation usw.) auf seinem oder seinen Operanden aus und liefert einen Wert zurück. Der Typ des Ergebniswerts wird durch den oder die Typen der Operanden bestimmt. Der Ergebniswert hängt vom Operator und von den Werten seiner Operanden ab. Die einstelligen Operatoren + und - bestimmen den positiven bzw. negativen Wert eines arithmetischen Ausdrucks. Die zweistelligen arithmetischen Operatoren: +, -, *, /, % stellen die Addition, Subtraktion, Multiplikation, ganzzahlige Division bzw. Restwertdivision (engl. modulo division) für zweistellige Operatoren dar. Diese Operatoren und ihre Bedeutungen sind zusammen mit einem Beispiel in Tab. 9.3-1 angegeben. [JLS: § 3.12, § 4.2.2, § 4.2.4]
Bemerkung: Operanden
Neben Literalen werden wir im Laufe des Kurses noch weitere Alternativen für Operanden in Ausdrücken kennen lernen. Operatoren, die auf mehr als einen Typen anwendbar sind, nennen wir überladen (engl. overloaded).
Definition: Arithmetischer Ausdruck
Ein arithmetischer Ausdruck (engl. arithmetic expression) wird gemäß folgender Regeln gebildet [JLS: § 15]: • Jede Variable eines numerischen Typs und jedes Literal eines numerischen Typs ist ein arithmetischer Ausdruck. • Wenn x ein arithmetischer Ausdruck ist, dann ist auch (x) ein arithmetischer Ausdruck. • Wenn x ein arithmetischer Ausdruck und eop ein einstelliger arithmetischer Operator ist, der vor dem Operanden steht, dann ist auch eop x ein arithmetischer Ausdruck. • Wenn x ein arithmetischer Ausdruck und eop ein einstelliger arithmetischer Operator ist, der nach dem Operanden steht, dann ist auch x eop ein arithmetischer Ausdruck. • Wenn x und y arithmetische Ausdrücke sind, und zop ein zweistelliger arithmetischer Operator, dann ist auch x zop y ein arithmetischer Ausdruck.
Begriff: Präzedenzregeln und Rangfolge von Operatoren
Wenn in einem Ausdruck mehrere Operatoren auftreten, wendet der Java- Übersetzer Präzedenzregeln an, um den Ausdruck auftretenden Operatoren auszuwerten, es sei denn, dass durch Klammern eine andere Reihenfolge vorgegeben wurde. Die Präzedenzregeln sind in Tab. 9.4-1 angegeben. (Die Tabelle enthält auch einige Operatoren, die wir erst in einem späteren Abschnitt besprechen werden.) Die Operatoren in der ersten Zeile haben den höchsten Rang, die in der letzten den niedrigsten. Operatoren gleichen Rangs werden von links nach rechts ausgewertet.
Definition: Auswertung arithmetischer Ausdrücke
Ein arithmetischer Ausdruck wird in einer strikten Reihenfolge gemäß folgender Regeln berechnet [JLS: § 15.7]:
• Ausdrücke, die in Klammern eingeschlossen sind, werden zuerst berechnet; im Falle von Verschachtelungen von innen nach außen. Klammerausdrücke erhalten somit die höchste Priorität bei der Auswertung.
• Zweistellige Operatoren werden von links nach rechts ausgewertet.
• Einstellige Operatoren werden von rechts nach links ausgewertet.
• Anschließend werden die Operatoren ihrem Vorrang entsprechend (s. Tab. 9.4- 1) ausgewertet.
• Wenn ein Ausdruck mehrere Operatoren des gleichen Vorranges enthält, werden die Operatoren von links nach rechts berechnet.
Beispiel: Auswertung arithmetischer Ausdrücke
Unter Berücksichtigung der Regeln in Definition wird der Ausdruck 17 * 2 % - (4 - 11) / (-3 + 5) in folgender Reihenfolge berechnet (gelesen von oben nach unten, der als Nächstes auszuwertende Unterausdruck ist unterstrichen): Auswertungsreihenfolge |Regel Auswertungsrichtung
17 * 2 % - (4 - 11) / (-3 + 5) | () von links nach rechts
-> 17 * 2 % - (- 7) / (-3 + 5) | () von links nach rechts
-> 17 * 2 % - (- 7) / 2 | - von rechts nach links
-> 17 * 2 % 7 / 2 | * von links nach rechts
-> 34 % 7 / 2 | % von links nach rechts
-> 6 / 2 | / von links nach rechts
-> 3 |
Definition: Datentypboolean
Der Datentyp boolean umfasst die beiden Literaletrue und false sowie die folgenden booleschen Operatoren:
• den einstelligen Präfixoperator!, der eine logische Negation beschreibt,
• fünf zweistellige Operatoren &&, ||, &, | und ^, um logische Ausdrücke aufzubauen und
• zwei zweistellige Vergleichsoperatoren == und !=, die die logische Gleichheit bzw. Ungleichheit beschreiben. Alle Operatoren vom Typ boolean sind mit ihrer Bedeutung und Anwendungsbeispielen in Tab. 9.5-1 angegeben. [JLS: § 3.10.3, § 4.2.5, § 15.22.2, § 15.23, § 15.24]
Begriff: Datentyp Char
Java bietet den einfachen Datentyp char an, der alle Unicode-Zeichen umfasst und seine Werte vorzeichenlos speichert. Unicode ist ein internationales Codiersystem für Zeichen, das es ermöglicht, mehr als 65000 Zeichen darzustellen. UnicodeZeichen umfassen:
• Groß- und Kleinbuchstaben,
• Ziffern,
• Interpunktionszeichen,
• Sonderzeichen für Operatoren,
• Sonderzeichen und -buchstaben, die in verschiedenen Sprachen benutzt werden, und
• Steuerzeichen, die es ermöglichen, Aufteilung und Umbruch einer Computerausgabe zu bestimmen.
Zeichen erscheinen zwischen einzelnen Anführungszeichen (’) wie: ’a’, ’B’, ’§’, oder ’-’. Steuerzeichen beginnen mit dem Rückwärts-Schrägstrich (engl. backslash) „\“. [JLS: § 3.10.4]
Steuerzeichen Die Zeichen ’\n’, ’\t’ und ’\b’ stehen zum Beispiel für die Steuerzeichen „neue Zeile“, „Tabulatorsprung“ bzw. „Rücktaste“.
Eine Variable besteht aus einem Namen und einem Wert. [JLS: § 4.12]
Eine Variablenvereinbarung oder Variablendeklaration ist eine Anweisung, die einen Namen mit einem Datentyp verknüpft. Die einfachste Form einer Variablendeklaration verbindet einen Namen name mit einem Datentyp type. Jede Deklaration wird durch ein Semikolon abgeschlossen. [JLS: § 14.4] type name;
Namen von Variablen bestehen aus einer Folge von Zeichen. Als Zeichen sind alle Unicodezeichen zugelassen. Das erste Zeichen darf jedoch keine Ziffer (0-9) sein. Ein Variablenname darf nicht mit einem reservierten Schlüsselwort der Sprache Java (s. Tab. 10.1-1) oder den Literalen true, false und null übereinstimmen. (Es gelten noch einige weitere Einschränkungen, die wir im Rahmen des Kurses nicht näher erläutern.) [JLS: § 3.8]
Der Ausdruck int menge; vereinbart eine Variable mit Namen menge vom Typ int, deren Wert noch unbestimmt ist
In jedem speziellen Umfeld darf eine Variable nur einmal vereinbart werden.
Beispiel: Ungültige Variablenvereinbarung
int breite;
double breite;
Die zweite Vereinbarung für den Namen breite ist unzulässig - unabhängig vom gewählten Typ.
Java-Konventionen: Variablennamen
Nach den Java-Konventionen beginnen Variablennamen mit einem Kleinbuchstaben. Namen sollten i. d. R. beschreibend und selbsterklärend sein. Namen, die mehr als ein Wort umfassen, sollten mit gemischten Buchstaben geschrieben werden, wobei Großbuchstaben für Wortanfänge in zusammengesetzten Namen verwendet werden: int anzahlBestellungen; boolean istPremiumkunde; Im Rahmen dieses Kurses verwenden wir für kurze Beispiele ohne Kontext gelegentlich Variablennamen aus einem einzelnen Zeichen. [JLS: § 6.8.7]
Definition: Zuweisung
Eine Zuweisung ist ein Ausdruck und zugleich eine Anweisung der Form:
varName = expression;
Wenn w(expression) den Wert des Ausdrucks expression bezeichnet, dann gilt unmittelbar nach der Ausführung der Zuweisung: w(varName = expression) == w(varName) == w(expression) [JLS: § 15.26, § 16]
Beispiel: Zuweisung
Sei x eine Variable vom Typ int. Die Zuweisung x = 42; hat zur Folge, dass der Variablen x der Wert 42 zugewiesen wird. Die Zuweisung x = 158 - 99; hat zur Folge, dass der Variablen x der Wert 59 zugewiesen wird, der sich als Ergebnis der Auswertung des Ausdrucks 158 - 99 ergibt. Die Zuweisung x = y; hat zur Folge, dass der Variablen x der Wert der Variablen y zugewiesen wird. Dies setzt voraus, dass die Variable y zuvor deklariert und bereits mit einem Wert belegt worden ist.
Beispiel: Auswertung und Zuweisung für dieselbe Variable
Die Variable x sei vom Typ int und habe den Wert 3. Dann wird durch die Anweisung:
x = 2 + 3 * x;
der Wert von x auf 11 geändert, weil die Auswertung des Ausdrucks 3 * x das Ergebnis 9 hat und 2 + 9 den Wert 11 ergibt.
Beispiel: Operator für verkürzte Schreibweisen von Zuweisungen
Seien
int x = 2;
int y = 5;
Der Ausdruck
x += 3;
ist die Abkürzung für den Ausdruck
x = x + 3;
Die Variable x nimmt als Ergebnis der Ausführung der Zuweisung den Wert 5 an. Der Ausdruck
y += 6 % 4;
steht abkürzend für
y = y + (6 % 4);
Nach Ausführung der Zuweisung hat y den Wert 7.
Beachten Sie, dass Operatoren für die verkürzte Schreibweise von Zuweisungen zuletzt ausgewertet werden. Wir können deshalb die verkürzte Schreibweise nicht in jedem Fall anwenden, wo rechts und links des Zuweisungsoperators dieselbe Variable auftritt. So lässt sich die Zuweisung als Beispiel x = 2 + 3 * x; nicht verkürzt schreiben, da ansonsten die Auswertungsreihenfolge verändert würde
Begriff: final
In Java kann eine Variable als endgültig oder final erklärt werden. Der Wert einer finalen Variablen kann, nachdem ihr zum ersten Mal ein Wert zugewiesen wurde, nicht mehr verändert werden. Um eine Variable als finale Variable zu deklarieren, wird das Schlüsselwort final dem Variablentyp vorangestellt. Der Wert einer finalen Variablen kann bei der Deklaration oder zu einem späteren Zeitpunkt der Programmausführung festgesetzt werden. Ein zweiter Versuch, einer finalen Variable einen Wert zuzuweisen, würde vom Übersetzer mit einer Fehlermeldung zurückgewiesen werden. [JLS: § 4.12.4]
Beispiel: Finale Variable final
final double PI = 3.147;
Die oben stehende Deklaration führt eine finale Variable einund belegt sie mit dem Wert 3.147. Die nachstehende Folge von Anweisungen zeigt eine Situation, in der eine finale Variable zunächst deklariert, aber noch nicht initialisiert wird und erst in einer nachfolgenden Anweisung mit ihrem endgültigen Wert belegt wird:
final int BLANKFINAL;
...
BLANKFINAL = 0;
Java-Konventionen: Konstanten, final-Variablen
Namen von Konstanten sollten nur Großbuchstaben enthalten. Das UnterstrichSymbol „_“ kann verwendet werden, um unterschiedliche Wörter in einem Konstantennamen zu trennen.
a)
double g = ...; double t = ...; double s; s = 0.5 * g * t * t;
b)
final double PI = 3.14; double r = ...; double a; a = PI * r * r;
c)
final double PI = 3.14; double h = ...; double r1 = ...; double r2 = ...; double v; v = (PI * h) / 3 * (r1 * r1 + r1 * r2 + r2 * r2);
Begriff: implizite Typanpassung und Typerweiterung
Numerische Typen weisen gewisse Familienbeziehungen in dem Sinne auf, dass bestimmte Typen im Wertebereich anderer Typen enthalten sind. Die Werte vom Typ byte zum Beispiel sind im Wertebereich des Typs int enthalten. Da Java jedoch eine stark typisierte Sprache ist, muss jeder Wert mit einem Datentyp verbunden sein, so dass der byte-Wert 23 vom int-Wert 23 unterschieden wird. Durch die Erweiterung (engl. widening) einer Zahl des Typs t wird diese in eine Zahl des Typs u umgewandelt. Der Wertebereich des Typ t muss eine Teilmenge des Wertebereichs des Typs u sein. Der Java-Übersetzer wendet solche Erweiterungsanpassungen automatisch an, falls eine Typverträglichkeit (engl. type compatibility) zwischen ungleichen Typen gegeben ist.
Beispiel: Typenverträglichkeit
Während der Auswertung des Ausdrucks
31.51 + 12
wird die Zahl 12 (vom Typ int) in die Zahl 12.0 vom Typ double umgewandelt. Als Ergebnis erhalten wir den Wert 43.51 vom Typ double.
Beachten Sie, dass Typumwandlungen nur während der Auswertung eines Ausdrucks und nur auf Werten vorgenommen werden. Der Typ einer Variablen ändert sich hierbei nicht. Hätten wir im vorherigen Beispiel anstelle der Zahl 12 eine int-Variable a verwendet, deren aktueller Wert 12 ist, so wäre diese nach Auswertung des Ausdrucks 31.51 + a unverändert eine int-Variable mit dem Wert 12.