Operators and Assignments


Determine the result of applying any operator (including assignment operators and instance of) to operands of any type class scope or accessibility or any combination of these.

In Java gibt es 9 Kategorien von Operatoren.
Operatoren
Kategorie Operator
Unäre Operator ++  --  +  -  !  ~
Cast Operatoren ()
arithmetische Operatoren *  /  %  +  -  
Shift Operator <<  >>  >>>
Vergleichsoperatoren   <=  >  >=  instanceof  ==  !=
bitweise Operatoren   ^  |
logische Operatoren &&  ||
ternäre Operatoren ?:
zuweisende Operatoren =  "op="

Bevor wir mit den Operatoren weiterarbeiten, muss ich hier kurz die Stufen der verschiedenen Typen darstellen.
  byte  ->  short  ->  int  ->  long  ->  float  ->  double
             char  -----^
 
Diese Reihenfolge ist bei allen unären und arithmetischen Operatoren zu beachten. Ein Typ kann ohne Konvertierung in einen nächsthöheren Typ umgewandelt werden. Umgekehrt muss man die Zahl casten, damit die Zahl in den niedrigen Typ reinpasst.
Bei den arithmetischen Operationen ist das Ergebnis immer mindestens int. Sind die Typen der Operanden niedriger als int, wie z.B. byte, short oder char, ist das Ergebnis immer int. Ist mindestens ein Operand höher als int, so hat das Ergebnis genau dengleichen Typen des Höchsten. Ist also eine Zahl byte und die andere float, so ist das Ergebnis auch float.

Unäre Operatoren: Inkrement und Dekrement
Die Inkrement und Dekrement-Operatoren können bei allen primitiven Typen, ausser boolean, angewendet werden. Dabei wird die Zahl um 1 inkrementiert oder dekrementiert.
Beide Operatoren können als prefix oder postfix benutzt werden. Der Unterschied ist, dass bei Inkrement-Operation prefix zuerst die Zahl um 1 erhöht wird und danach evaluiert. bei postfix wird zuerst evaluiert und danach um 1 erhöht. Beispiel:
int x = 2;
int y = ++x + 10;
Hier hat die Variable y den Wert 13. x wird um 1 erhöht und danach mit 10 addiert.
In dem unteren Beispiel sieht man die Auswirkung von post-Inkrement:
int x = 2;
int y = x++ + 10;
Hier ist das Ergebnis y=12. Nach der Operation hat x den Wert 3. Das heisst, x wird mit 10 addiert und x um 1 erhöht.

Unäre Operatoren: Plus und Minust
Der Plus-Operator hat eigentlich keine Bedeutung. Hier wird explizit gesagt, dass die Zahl positiv ist. Der Minus-Operator invertiert die Zahl, also positiv wird zu negativ und negativ wird zu positiv.

Der bitweise Operator ~:
Dieser Operator kann nur bei byte, short, int, long oder char angewendet werden. Der Operator invertiert alle Bits der Zahl. Wenn zum Beispiel ein byte die folgenden Bits hat:
0000 1001
so wird aus der Zahl nach der Invertierung:
1111 0110

boolean komplement Operator !
Dieser Operator kann nur bei boolean angewendet werden. Aus true wird false und umgekehrt.

cast Operator ()
Bei diesem Operator werden explizite Konvertierungen in die niedrigere Typen gemacht. Beispiel:
int x = (cast)(Math.Pi * y);
Da das Ergebnis von Math.Pi * y ein double ist, muss eine Konvertierung gemacht werden, damit das Ergebnis zu x zugewiesen werden kann.

Arithmetische Operatoren
Sie können auf alle numerischen Typen angewendet werden. Überlauf erzeugt kein Exception. Wenn das Ergebnis mehr Bits benötigt, als der Typ erlaubt, so werden die höheren Bits abgeschnitten; somit ist das Ergebnis unbrauchbar.
Modulo: Bei diesem Operator wird die linke Zahl durch die rechte Zahl dividiert. Das Ergebnis von diesem Modulo-Operator ist der Rest, welcher nicht mehr zu teilen ist. Das Vorzeichen wird nur durch die linke Zahl bestimmt. Ist die rechte Zahl 0, so wird ein Exception ausgeworfen.

Shift-Operatoren
<< : führt eine Verschiebung der Bits nach links durch. Dabei wird rechts mit 0 aufgefüllt. Die allgemeine Formel ist: Zahl * 2x, wobei x = Anzahl der geshifteten Bits. Ist der Wert ein int und die Anzahl der geshifteten Bits grösser als 32, so kann man die Anzahl der geshifteten Bits mit einer Formel vereinfachen: "Anzahl der Bits % 32"-> Ergebnis ist die neue Anzahl der zu shiftenden Bits.
Beispiel:
Zahl binär Operator binär Ergebnis
1 0000 0001 1<<1 0000 0010 2

>> : führt eine Verschiebung der Bits nach rechts durch. Dabei wird links mit dem Bit aufgefüllt, welches das höchste Bit ist. Die allgemeine Formel ist: Zahl / 2x, wobei x = Anzahl der geshifteten Bits
>>>: führt eine Verschiebung der Bits nach rechts durch. Dabei wird links mit 0 aufgefüllt.

Vergleichsoperatoren
Alle Vergleichsoperatoren ergeben boolean. Sie werden angewendet bei numerischen Typen. Jeder Type kann mit jedem verglichen werden. byte, short und char werden zu int konvertiert. Ist ein Operand im Gültigkeitsbereich grösser als der andere Operand, so wird der kleinere in den grösseren konvertiert.
instanceof-Operator gehört auch zu den Vergleichsoperatoren, weil das Ergebnis ein boolean ist. Mit diesem Operator wird überprüft, ob ein Objekt zu einer Klasse gehört. Der erste Operand ist eine Objektreferenz, der zweite ist der Name einer Klasse oder eines Interfaces.

bitweise Operatoren
können bei booleans und interalen numerischen Operanden angewendet werden.

Operatoren
 X   Y   ~X   X&Y   X|Y   X^Y 
1 1 0 1 1 0
1 0 0 0 1 1
0 1 1 0 1 1
0 0 1 0 0 0


logische Operatoren
Bei diesen Operatoren wird der zweite Teil nur dann ausgewertet, wenn durch den ersten Teil das Ergebnis nicht festliegt.
Beispiel:
int x = 5;
int y =10;
if (x > 0 || y++>0)
hier ist x grösser als 5, d. h. true. Der zweite Teil wird nicht ausgewertet und y hat immer noch den Wert 10. Anders ist es im unteren Beispiel.
int x = 5;
int y =10;
if (x > 0 && y++ > 0)
Nach der if-Anweisung hat y den Wert 11.

ternäre Operatoren
Format:   a  =  x  ?  b  :  c;
a bekommt den Wert von b, wenn x true ist, sonst hat a den Wert von c. Hier ist wieder zu beachten, dass b und c auf den gleichen Typ gebracht werden.

zuweisende Operatoren
einfache Zuweisung mit dem Gleichheitszeichen =
Kalkulations und Zuweisungsoperatoren (calculate and assign) werden auch als op= bezeichnet. Beispiel:
a *=b; ist gleichbedeutend mit a = a *b;

nach oben

Determine the result of applying the boolean equals() (Object) method to objects of any combination of the classes java.lang.String, java.lang.Boolean, and java.lang.Object.

Hier wird der Unterschied zwischen Objektgleichheit und Referenzgleichheit getestet. Mit den Operatoren == bzw != wird überprüft, ob die Referenzen gleich sind, aber nicht die Inhalte. Um die Gleichheit der Inhalte zu prüfen, benutzt man die equals()-Methode, welche von der java.lang.Object abgeleitet ist.
Beispiel:
    String a = new String("hallo");
    String b = new String("hallo");
    if(a == b) :Ergebnis ist false, weil die beiden Strings verschiedene Referenzen haben.
    a.equals(b) liefert als Ergebnis true, weil sie inhaltlich gleich sind.
    
    Boolean b1 = new Boolean(true);
    Boolean b2 = new Boolean(false);
    Object o1 = new Boolean(false);

    b1.equals(b2) liefert false
    o1.equals(b2) liefert true

nach oben

In an expression involving the operators &, |, && and ||, state which operands are evaluated and determine the resulting value of the expression.

In diesem Teil wird der Unterschied zwischen den logischen Operatoren und bitweisen Operatoren abgefragt. Diese Operatoren wurden oben behandelt, so dass hier nicht weiter darauf eingegangen wird.


nach oben

Determine the effect upon objects and primitive values of passing variables into methods and performing assignments or other modifying operations in that method.

Hier gilt zu unterscheiden zwischen "passing by value" und "passing by reference".
passing by value bedeutet, dass einer Methode nur eine Kopie der Variablen übergeben wird, aber das Original wird beibehalten. In der Methode kann der Inhalt dieser Variable verändert werden, aber der Inhalt der Originalvariable wird nicht modifiziert.
Beispiel:
class PassByValue
{
    public static void main(String[] args)
    {
        int i = 10;
        veraendere(i);
        System.out.println(i);
    }
    
    private static void veraendere(int i)
    {
        i += 50; // hier ist eine Kopie der Variablen i.  
    }
}
passing by reference: hierbei wird die Referenzadresse der Variable übergeben. Wenn die Variable in der Methode verändert wird, so hat die Originalvariable, wenn die Methode verlassen wird, diesen geänderten Wert.
class A{
    int z=4;
    void meineMethode(A a) {a.z++;}
    public static void main(String [] args){
        A meinA = new A();
        meinA.meineMethode(meinA);
        System.out.println(meinA.z);
    }
}
Ergebnis ist 5.
Valid XHTML 1.1! Valid CSS!