3 Befehle in Java Variablen, Ausrücke, Anweisungen und zusammengesetzte Anweisungen Variablen sind über einen Namen angesprochene Speicherplätze. Variablen Die Art und Größe des erforderlichen Speicherplatzes richtet sich nach dem Typ der Variablen, ist aber vom Nutzer (Programmierer) nicht unmittelbar beeinflußbar. Die elementaren Datentypen (Zahlen, Char., Bool.) sprechen unmittelbar ihre Werte an. xyz Wert Alle übrigen Datentypen (Klassen) referenzieren jeweils ihren Datenbereich Abc Referenz Werte
Rolle von Variablen Grundsätzlich dienen Variablen dazu, Daten in einem dafür vorgesehenen Speicherbereich zu verwalten. 1.lokale Variablen eines Blocks (z.b. for-anweisung). Sie werden im Block angelegt und beim Verlassen des Blocks wieder aufgegeben. 2.Feldkomponenten, die bei der Erzeugung eines Feldes angelegt werden. 4.Methodenparameter,sie werden beim Aufruf der Methode angelegt und nach Abarbeitung des Methodenrumpfes aufgegeben. 5. Methoden-Rückgabe, sie ist unbenannt uns steht nur noch unmittelbar nach Abarbeitung des Methodenrumpfes für eine Zuweisung zur Verfügung, danach wird sie aufgegeben. Garbage Collection Wird eine Variable am Ende eines Blocks (einer Methode) aufgegeben, dann steht deren Namen und damit der Verweis auf die entsprechende Speicherstelle nicht mehr zur Verfügung. Wurde diese Referenz nicht vorher an andere Stelle kopiert (Zuweisung), kann auf den Speicherbereich aus dem Programm nicht mehr zugegriffen werden. Die Garbage Collection ist ein Mechanismus, der in unregelmäßigen Abständen das ablaufende Programm durchforstet, welche Speicherbereiche noch referenziert werden. Alle nicht mehr referenzierten Bereiche werden dann wieder zur neuen Verwendung freigegeben.
Deklarationen Bevor eine Variable verwendet werden kann, muß sie deklariert sein (Speicherreservierung!). Eine Deklaration hat die Form Typname Dekl1,Dekl2,..,Dekln; dabei haben die einzelnen Teile Dekli die Form Variablenname oder mit Initialisierung: Variablenname=konstanterAusdruck Wird die Variable nicht explizit initialisiert, erzeugt Java automatisch eine Initialisierung (mit einem 0-Wert). Eine Variable wird nach Beendigung des {}-Blocks, in dem sie deklariert wurde aufgegeben und der Speicherplatz von der garbage collection freigegeben, falls er nicht inzwischen von einer anderen Variable referenziert wird. Variablennamen können in einem Block oder untergeordneten Block nicht umdeklariert werden. Beispiel { int i=7, j=i+1, k;... { foat i=(3/2)*math.pi //Fehler!... }... } { int i=-5 //zulässig, da neuer Block... }
Ausdrücke Ausdrücke werden nach folgenden Regeln aus Variablen Konstanten und Operationen aufgebaut: Variablen und Konstanten sind Ausdrücke Ist A ein Ausdruck, so auch -A, ++A, --A, ~A,!A, A++, A-- und jeder Methodenaufruf Name(A) Sind A, B Ausdrücke, so auch A+B, A-B, A*B, A/B, A%B, A<<B, A>>B, A>>>B, A<B, A<=B, A==B, A>=B, A>B, A!=B, A&B, A B, A^B, A&&B, A B Sind A, B, C Ausdrücke und B boolesch, dann auch B?A:C Die Ausdrücke, die in eine mehrstellige Operation eingesetzt werden unterliegen der Einschränkung, daß die Typen übereinstimmen müssen, andernfalls ergibt sich ein Übersetzungsfehler oder bei Zahlentypen eine automatische Typanpassung. Ausdrücke, in denen keine Variablen vorkommen heißen konstante Ausdrücke. einstellige Operatoren arithmetisch: (d.h. Eingabe numerischer Typ) + keine Auswirkung - negative Zahl ~ bitweises Komplement // ~01101001 == 10010110 Operatoren mit Seiteneffekt ++ Inkrement (prä- oder post-) // x+1 -- Dekrement (prä- oder post-) // x-1 boolesch: (d.h. Eingabe boolean)! Komplement //! true ==false! false == true
Wert-/Referenz-Übergabe Alle erwähnten Operatoren nehmen Werte entgegen und liefern Werte desselben Typs ab, nicht aber die Inkrement / Dekrement-Operation ++, --. ++, -- nehmen außer der Wertrückgabe noch eine Veränderung der Eingabe vor und benötigen deshalb einen Platz, wo sie diese Veränderung notieren können. Deshalb darf die Eingabe dort nur eine Variable (Referenz) und keine Konstante oder komplexer Ausdruck sein. Werte sind im gegensatz zu Variablen nur tempörär verfügbare Speicherplätze, in denen Zwischenergebnisse einer Ausdruck-Berechnung abgelegt werden, um sie unmittelbar in einer Operation oder einer Zuweisung weiterzuverwenden. Arithmetische Operatoren Die (2-stelligen) arithmetischen Operationen erfordern als Eingaben vom gleichen numerischen Typ, der auch der Typ des Ausgabewerts ist. Sind die Eingabetypen nicht gleich, so wird eine automatische Typ-Anpassung vorgenommen. + Addition - Subtraktion * Multiplikation / Division % Rest bei Division (mod) Klammersparregeln: *,/,% haben höhere Priorität als +,- (Punktrechnung vor Strichrechnung) Ohne Klammern wird Linksklammerung angenommen (z.b. ((a+b)+c)+d) )
Bit-Operatoren Diese Operatoren (wie auch ~) werden auf ganzzahlige Typen angewandt und verändern einzelne Bits. shift-operatoren (Multiplikation mit 2 n ) << shift nach links // a<<b == a*2 b >> shift nach rechts mit Vorzeichen // a>>b == a*2 -b >>> shift nach rechts mit Null //a>>b == a*2 -b als vorzeichenlose Zahl a boolesche Operatoren (auch für boolean) & bitweises AND // xandy ==1 <=> x==y==1 bitweises OR // xory == 0 <=> x==y==0 ^ bitweises XOR // xxory == 0 <=> x==y rein boolesche Operatoren (nur für boolean) && AND mit lazy evaluation // a!=0 && b/a>=c kein Laufzeitfehler bei a==0 OR mit lazy evaluation // a==0 b/a>=c kein Laufzeitfehler bei a==0 Vergleichs-Operatoren Vergleiche erwarten Eingaben desselben (numerischen) Typs und liefern einen booleschen Wert ab. < kleiner <= kleinergleich == gleich > größer >= größergleich!= ungleich Das Konditional?: erwartet eine boolesche Eingabe und zwei Eingaben desselben (beliebigen) Typs: b?x:y liefert x, falls b=true, und sonst y
Die Anweisungen von Java sind: Deklarationen mit und ohne Initialisierung Ausdrucksanweisungen Anweisungen Zuweisung, In-/Decrement, Methodenaufruf, Erzeugung (new) Auswahl if, switch Schleifen while, do..while, for sonstige label, break, continue, return, throw, try, synchronized Deklarationen Bevor ein Objekt (Variable, Methode, Klasse) verwendet werden kann, muß es deklariert sein (Speicherreservierung!). Eine Deklaration hat die Form Typname Dekl1,Dekl2,..,Dekln; dabei haben die einzelnen Teile Dekli die Form Objektname oder mit Initialisierung: Objektname=konstanterAusdruck Objektname{Definition} Wird das Objekt nicht explizit initialisiert, erzeugt Java automatisch eine Initialisierung (mit einem null-wert). Ein Objekt wird nach Beendigung des {}-Blocks, in dem sie deklariert wurde aufgegeben und der Speicherplatz von der garbage collection freigegeben. Objektnamen können in einem Block oder untergeordneten Block nicht umdeklariert werden.
Blöcke An Stellen, wo die Grammatik von Java eine Anweisung erwartet, kann es sein, daß der Programmierer keine oder mehrere Anweisungen einfügen möchte. Hier helfen: Leere Anweisung : ; die keinerlei Auswirkung hat. Anweisungsblock: { A1 ; A2 ;... ; An} In { } eingeschlossene und durch Semikola getrennte Anweisungen werden nacheinander ausgeführt und ersetzen eine einzige Anweisung. Zuweisungen Bei einer Zuweisung ( = ) wird die rechte Seite des Ausdrucks ausgewertet und dann der Variablen auf der linken Seite zugewiesen. Die linke Seite einer Zuweisung muß also stets eine Variable sein. Für jede zweistellige Operation o gibt es den zugehörigen Zuweisungsoperator =o, der als Kurzform auftritt: x =o y steht für x = xoy Die Java-Zuweisungsoperatoren sind demnach: = *= /= %= += -= <<= >>= >>>= &= ^= =
Methodenaufrufe Methoden sind (aus Klassen, Paketen) eingebundene oder selbst definierte Codestücke, die ggf. Parameter entgegennehmen und einen Wert zurückliefern. Sie werden mit ihrem Namen und den Parametern (in Klammern) aufgerufen. PrintWriter out = new PrintWriter(System.out,true) // erzeugt ein (Ausgabe-) Objekt // namens out out.println(i + ist positiv ) Math.sin(3.1) (byte) n*m // druckt die Zahl i und // ist positiv in eine Zeile // gibt den sin(3.1) zurück // wandelt den Typ von n*m in byte um Fallunterscheidungen Um situationsabhängig eine oder eine andere Anweisung auszuführen benötigt man Fallunterscheidungen (z.b. zeichne eine Kreis nur, wenn er in das Anzeigefenster hineinpasst), die in Java durch die if-anweisung (zwei Fälle) oder die switch-anweisung (viele Fälle) realisiert wird.
Die if Fallunterscheidung FürJa-Nein-Fallunterscheidungen gibt es die if-anweisung in folgenden zwei Varianten: if ( Bedingung ) Anweisung1 if ( Bedingung ) Anweisung1 else Anweisung2 Dabei ist Bedingung ein Ausdruck, der einen booleschen Wert zurückgibt Es wird zunächst die Bedingung ausgewertet. Ist der Wert true, dann wird Anweisung1 ausgeführt, ist der Wert false, dann wird die Anweisung1 übergangen (und ggf. Anweisung2 ausgeführt) Die switch-fallunterscheidung Für eine Fallunterscheidung mit mehr als 2 Fällen (Ja-Nein) gibt es die switch- Anweisung: switch (Ausdruck) { case konstanterausdruck1 : Anweisung1; case konstanterausdruck2 : Anweisung2;... case konstanterausdruckn : AnweisungN; default : Anweisung0 } Alle Ausdrücke müssen jeweils Werte von demselben Typ aus byte, char, short, int zurückgeben. Statt einem konstanten Ausdruck dürfen auch mehrere durch Kommata getrennt nach jedem case folgen. Nach jeder case-zeile darf nach der Anweisung noch die Anweisung break; folgen, die zur Folge hat, daß die nachfolgenden Zeilen (insbesondere default) nicht mehr bearbeitet werden, d.h. die Fallunterscheidung wird sofort unterbrochen, wenn dieser Fall eingetreten ist. Ist der Wert des Ausdrucks gleich dem Wert eines konstanten Ausdrucks in einer case-zeile, so wird die dahinterstehende Anweisung ausgeführt. Wurde keine case-zeile mit break aktiviert, so wird am Schluß noch die default- Anweisung ausgeführt.
Schleifen Um Wiederholungen derselben Handlung (z.b. zeichne immer wieder Kreise mit variierenden Radien) zu realisieren kennt Java drei Schleifen-Varianten : while (abweisende Schleife), do...while (nicht abweisende Schleife) und for (Zähl-Schleife). while ( Bedingung ) Anweisung Abweisende Schleife Dabei ist Bedingung ein Ausdruck, der einen booleschen Wert zurückgibt. Es wird die Bedingung ausgewertet, falls sie zu true auswertet, wird die Anweisung augeführt und wieder zu der Bedingung zurückgekehrt. Sobald sie zu false auswertet, ist die Schleife beendet. Wenn die Bedingung schon zu Anfang zu false auswertet, wird die Anweisung nie ausgeführt (abweisend).
do Anweisung while ( Bedingung) ; nicht abweisende Schleife Dabei ist Bedingung ein Ausdruck, der einen booleschen Wert zurückgibt Es wird zunächst die Anweisung ausgeführt und danach die Bedingung ausgewertet. Wertet sie zu true aus, so wird zur Anweisung zurückgekehrt. Sobald die Bedingung zu false auswertet, ist die Schleife beendet. Die Anweisung wird wenigstens einmal ausgeführt (nicht abweisende Schleife). Zählschleife for (Initialisierung ; Bedingung ; Update ) Anweisung Initialisierung weist der Laufvariable ihren Anfangswert zu, dabei kann sie auch deklariert werden. Bedingung ist wieder ein boolescher Ausdruck, der bei Wert false die Schleife abbricht. Update enthält Anweisungen (durch Kommata getrennt), die die Veränderung der Laufvariablen in jeder Runde realisieren. Anweisung ist der eigentliche Schleifenkern, der wiederholt werden soll.
Zählschleife 2 Jeder der vier Einträge ist optional, insbesondere die Anweisung kann mit in das Update aufgenommen werden, wenn sie nicht ein sehr komplexes Gebilde ist. Beim Eintritt in die for-schleife wird zunächst die Initialisierung durchgeführt, danach wird die Bedingung ausgewertet und, falls true, zuerst die Anweisung und dann das Update ausgeführt und zur Bedingung zurückgegangen. Sobald die Bedingung zu false auswertet, ist die Schleife zu ende. Auch wenn die Laufvariable erst in der Initialisierung von for deklariert wird, ist sie auch nach dem Abbruch noch in dem gesamten Block zugreifbar, in dem die for-schleife steht. Die break-anweisung break und continue Ähnlich wie bei der Fallunterscheidung kann auch in einer Schleife eine break-anweisung (in einer entsprechenden if- Abfrage) stehen, die dann zum sofortigen Abbruch der Schleife führt. Diese Technik verwendet man bei sehr komplizierten Abbruchbedingungen, dann kann meist auf eine weitere Bedingung in der for-schleife verzichtet werden. Die continue-anweisung Auch die Bearbeitung der Anweisung kann frühzeitig unterbrochen und mit einem continue auf den nächsten Fall der Schleife weitergesprungen werden.