Nutzung von Variablen Name 1 AnPr Klasse Datum Allgemein Wie der Name „Datenverarbeitung“ schon verrät, dienen Rechner dazu Daten zu speichern, zu ändern und wieder auszugeben. Programme bilden den Algorithmus ab, wie die Daten zu verändern sind. Die Frage ist nun, wie speichert man die Daten im Rahmen der Programme in den Rechnern ab? Grundsätzlich wissen wir zwar alle, dass dies irgendwo im Speicher (RAM) des Computers erfolgt, doch hierbei gibt es einiges zu beachten: Wo werden im Speicher die Daten abgelegt – also unter welcher Adresse? Wie kommen wir an die Daten wieder ran, um sie bspw. auszugeben? Wie gehen wir mit der Tatsache um, dass zum Zeitpunkt des Schreibens des Programms die Speicherbelegung anders sein wird, als zum Zeitpunkt der Programmausführung und wir somit vorher nicht wissen, wo die Daten zur Laufzeit abgelegt werden? Wie teilen wir dem Rechner mit, wie viel Platz er für unsere Daten vorsehen muss? Realisiert wird dies durch die Einführung von Variablen. Diese sollen all die oben genannten Probleme lösen, indem sie als eine Art Behälter für Daten fungieren. Hierbei sind diverse Eigenschaften vonnöten: Variablen…: haben… haben… haben… haben… Variablen sind Platzhalter für Daten im Speicher. Um nun mit Variablen arbeiten zu können, müssen nun einige Voraussetzungen erfüllt sein: Der Programmierer muss der Variablen einen Namen geben, um Daten in der Variablen speichern, ändern oder Daten auslesen zu können. Der Programmierer muss dem Computer mitteilen, wie viel Platz die Daten benötigen, welche in der Variablen abgespeichert werden sollen – also der Datentyp der Variablen. Der Programmierer muss eine Logik vorsehen, wie die Daten in die Variable abgelegt werden sollen – also die Zuweisung von Werten. Der Computer muss in der Lage sein, der Variablen im Speicher einen Platz zuzuweisen und den Namen der Variablen fest mit dem Platz zu verknüpfen – also das Speichermanagement. Im Folgenden werden die einzelnen Zusammenhänge näher erläutert, so dass man in der Lage ist, die Variablen zu nutzen und eventuelle Probleme vorher zu erkennen. ANPR_04_Variablen_v01.docx Seite 1 Nutzung von Variablen 2 AnPr Deklaration und Datentypen Das Festlegen des Namens und des Datentyps nennt man Deklaration der Variablen. Üblicherweise wird gleich bei der Deklaration ein initialer Wert festgelegt, man spricht hier von der Initialisierung. 2.1 Syntax Deklaration Der Syntax sieht wie folgt aus: int: iVar: 3: Datentyp Variablenname Variablenwert Bei der Deklaration können zwei verschiedene Grundtypen unterschieden werden, Variablen und Konstanten. Variablen können ihren Wert zur Laufzeit ändern, der Wert von Konstanten wird bei der Kompilierung festgelegt. Eine Konstante wird wie folgt deklariert: final int I_VAR = 3; Das Schlüsselwort „final“ zeigt dem Compiler an, dass sich der Wert der Variable nicht mehr ändert. Um den Code einfacher lesbar zu machen, werden Konstanten üblicherweise nur mit Großbuchstaben benannt. Bei der Festlegung der Datentypen müssen zuerst zwei Grundtypen unterschieden werden. Einfache Datentypen bestehen „lediglich“ aus einem einzigen Wert, der im Speicher zusammenhängend abgelegt wird. Zusammengesetzte Datentypen sind wiederum aus mehreren einfachen Datentypen zusammengesetzt und werden in Java als Klassen realisiert. Der bekannteste Vertreter von zusammengesetzten Datentypen ist die String Variable – also eine Zeichenkette. 2.2 Übersicht Datentypen Im Folgenden die wichtigsten Datentypen in Java: Inhaltstyp: Wahrheitswert Ganze Zahl Beispiel: Datentyp: Wertebereich: true Speicherbedarf: true/false 8 bit -128 bis 127 8 bit -32.768 bis 32.767 16 bit -2.147.483.648 bis 2.147.483.647 32 bit 4 -9.223.372.036.854.775.808L 9.223.372.036.854.775.807L +/-1,4E-45 bis +/-3,4E+38 (7 signifikante Stellen) +/-4,9E-324 bis +/-1,7E+308 (15 signifikante Stellen) 64 bit 32 bit Gleitkommazahl 4.0 Zeichen '4' 0 bis 65.535 (z. B. 'A') 16 bit Zeichenkette "4" beliebig variabel Seite 2 64 bit AnPr Nutzung von Variablen Obwohl es auch Programmiersprachen gibt, bei denen unbestimmte Datentypen existieren (bspw. Variant in Visual Basic) wird immer empfohlen, die „passenden“ Datentypen für seine Programme zu verwenden – das spart im Zweifelsfall Speicherplatz. In Java wird jedoch für ganze Zahlen immer int verwendet, es sein denn es werden extrem viele Daten abgelegt, bei denen dies zu Speicherproblemen führen würde. 2.3 Wrapper-Klassen Zu jedem einfachen Datentyp gehört in Java auch eine sogenannte Wrapper-Klasse, welche Hilfsfunktionen für die einzelnen Datentypen aufweist. Die wichtigste ist das parsen von Strings inklusive Umwandlung des gefundenen Wertes in den einfachen Datentyps: String sStringWert = "123"; int iIntWert = Integer.parseInt(sStringWert); // iIntWert hat nun den Wert 123 als Integerzahl Im obigen Beispiel wird in eine Stringvariable der String "123" geschrieben. Dies ist aus Datensicht keine Zahl, sondern eine Zeichenkette. Die Methode "parseInt" prüft nun, ob in der Variable in Klammern eine Zeichenkette vorhanden ist, welche sich in eine Integerzahl umwandeln lässt. Wenn ja, dann gibt die Methode die Zahl zurück, wenn nein, wird ein Fehler erzeugt und das Programm unterbrochen. Hier die wichtigsten Wrapperklassen mitsamt oft genutzten Methoden: Datentyp: Wrapper- Methode: Klasse: int Integer parseInt(str) double Double char boolean Character Boolean Bedeutung: Der String str wird nach einer Integer Zeichenkette geparst und als int Datentwert zurückgegeben. decode(str) Dekodiert einen String, der als Hexwert (0x, 0X oder # mit folgender Hexzahl) oder Oktalwert (0 mit folgender Oktalzahl) in eine Dezimalzahl. toHexString(i) Der Dezimalwert i wird in eine Hexadezimalzahl in Stringrepräsentation gewandelt. toOctalString(i) Der Dezimalwert i wird in eine Oktalzahl in Stringrepräsentation gewandelt. toBinaryString(i) Der Dezimalwert i wird in eine Binärzahl in Stringrepräsentation gewandelt. toString(i) Der Dezimalwert i wird in einen String umgewandelt. parseDouble(str) Der String str wird nach einer Integer Zeichenkette geparst und als double Datentwert zurückgegeben. toHexString(d) Der Dezimalwert d wird in eine Hexadezimalzahl in Stringrepräsentation gewandelt. toString(d) Der Dezimalwert d wird in einen String umgewandelt. toString(c) Der Charwert c wird in einen String umgewandelt. getBoolean(str) Der String str wird nach einem true/false geprüft und der logische Wert true/false wird zurückgegeben. toString(b) Der boolean Wert wird in einen String umgewandelt. Alle anderen einfachen Datentypen haben ebenfalls Wrapper-Klassen. Da sie seltener verwendet werden wird an dieser Stelle lediglich auf die Java Dokumentation verwiesen: http://docs.oracle.com/javase/7/docs/api/java/lang/package-tree.html Seite 3 Nutzung von Variablen AnPr 2.4 Typecast Neben den oben genannten Möglichkeiten Datentypen in Strings und umgekehrt zu verwandeln, gibt es noch die Typecats. Hierbei wird ohne eine Methode aufzurufen der Datentyp direkt umgewandelt. Hier unterscheiden wir zwischen: Explizite Typecasts Implizite Typecasts Explizit bedeutet, dass dem Rechner direkt mitgeteilt wird, dass von einem Datentyp A in einen Datentyp B umgewandelt werden soll. Dies ist bei allen numerischen Datentypen immer möglich – wenn jedoch Datenverlust droht (also großer Datentyp nach kleiner umgewandelt), dann muss er explizit erfolgen. Ein Expliziter Typecast sieht wie folgt aus: Zielvariable = (Zieldatentyp) Quellvariable Hier ein Beispiel eines expliziten Typecasts von double zu int: iIntVariable = (int) dDoubleVariable; Imlizit bedeutet, dass der Zieldatentyp nicht angegeben werden muss – dies ist nur dann möglich, wenn kein Datentypverlust droht (also kleiner Datentyp nach großem Datentyp): dDoubleVariable = iIntVariable; In der folgenden Tabelle sind in der ersten Spalte der Zieldatentyp und in der unteren Zeile die Quelldatentypen. Explizite Typecasts sind mit „E“, implizite mit „I“ gekennzeichnet: = short = int = long = float = double = Seite 4 double float long int short = byte char char byte AnPr Nutzung von Variablen 2.5 Datentypen von Operationen Neben den Typecasts gibt es noch eine weitere Situation, in der implizit Typen gewandelt werden. Werden bspw. zwei Zahlen eines Datentyps addiert, so ist das Ergebnis immer vom gleichen Datentyp, wie die beiden Ausgangsdatentypen. Sind es zwei verschiedene Datentypen, so muss sich der Computer für den Ergebnisdatentyp entscheiden. Folgende Regel gilt: Bei der Verknüpfung von zwei Datentypen ist das Ergebnis immer vom Typ des größeren Datentyps. Beispiel: int iVar = 2; byte byVar = 4; Die Rechnung iVar * byVar = ergibt den Datentyp: …………….. int iVar1 = 2; byte iVar2 = 4; Die Rechnung iVar1 * iVar2 = ergibt den Datentyp: …………….. Was ergibt somit 2/4: …………………… 2.6 Namenskonventionen Welcher Code ist einfache lesbar: Code1: int a = 3; double b = 10.5; double c = a * b; Code2: int iAnzahl = 3; double dEinzelGewicht = 10.5; double dGesamtGewicht = iAnzahl * dEinzelGewicht; Variablennamen sollen folgende Eigenschaften aufweisen: Datentyp: byte short int long boolean Präfix: by s i l b Beispiel: byIdWert sAnzahl iAnzahl lAnzahl bFehleingabe Datentyp: float double char String Präfix: f d c s Beispiel: fBetrag dBetrag cKennung sEingabe Seite 5 Nutzung von Variablen 3 AnPr Lizenz Diese(s) Werk bzw. Inhalt von Maik Aicher (www.codeconcert.de) steht unter einer Creative Commons Namensnennung - Nicht-kommerziell - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz. Seite 6