» Tutorial / Java Grundlagen / Operatoren

In der zweiten Hälfte unseres Tutorials wollen wir uns mit den Operatoren beschäftigen. Dabei handelt es sich um Anweisungen, die auf der Basis von Werten mathematische Operationen durchführen.


» Kategorisierung nach oben «

Bevor wir uns nun den verschiedenen Operatoren widmen, wollen wir kurz einige wichtige Merkmale aller Operatoren beschreiben, durch die sie sich spezifizieren lassen. Dabei gibt es vier Kategorien zu nennen, die die Operatoren in ihrer Funktionalität beschreiben.

Die hier vermittelten Grundlagen werden später als entsprechende Spalten in den Operatortabellen wieder auftauchen, um alle Informationen übersichtlich und zusammenhängend darstellen zu können. Daher sollten Sie sich diese Punkte gut einprägen oder gegebenenfalls noch einmal nachschlagen.


» Operanden

Jeder Operator hat eine bestimmte Anzahl von Operanden, die fest an der Operation beteiligt sind. Java kennt hier drei verschiedene Typen mit entweder einem, zwei oder drei Operanden. In den folgenden Beschreibungen der verschiedenen Operatoren werden wir daher jeweils angeben, um welchen Typ es sich handelt.


» Typisierung

Alle Operanden werden eindeutig durch ihren Typ bestimmt. Dadurch wird festgelegt, mit welchen Typen ein Operator arbeiten kann. Folglich werder wir eine Tabelle mit allen acht möglichen Typen aufstellen. Die hier aufgestellten Bezeichnungen werden dann wieder in den Tabellen der entsprechenden Operatorbeschreibungen auftauchen.

Bezeichnung
 
N
I
L
P
A
S
R
V

» Priorität

Die Operatorpriorität stellt eine der wichtigsten Spezifizierungen dar. Sie legt fest, welche Operatoren in einer Anweisung Vorrang haben. Dadurch wird zum Beispiel sichergestellt, dass Anweisungen in einer logischen und korrekten Reihenfolge ausgeführt werden, sowie mathematische Grundregeln eingehalten werden.

In den entsprechenden Tabellen werden daher alle Operatoren durch ihre Priorität geordnet werden. Die Operatoren mit einer kleineren Zahl entsprechen dabei den am höchsten priorisierten Operatoren.

» Assoziativität

Die Assoziativität beschreibt die Richtung der Ausführung von Operatoren, die die gleiche Prioritätsstufe besitzen. Diese kann entweder von links nach rechts oder umgekehrt verlaufen. So werden die mathematischen Rechenregeln sicher durchgeführt.

In komplexen Ausdrücken werden daher zunächst aller höher priorisierten Ausdrücke ausgeführt und erst danach werden auf Grund der Assoziativität alle Zwischenwerte zusammengefasst.


» arithmetische Operatoren nach oben «

Java kennt fünf arithmetische Operatoren für mathematische Berechnungen. Hinzu kommen zwei Operatoren für die Vorzeichenkennzeichnung.

Die arithmetischen Operatoren verwenden numerische Typen und liefern numerische Werte. Bei unterschiedlichen Datentypen entspricht der Ergebnistyp dem größeren der beiden Operanden. Die Umwandlung der Werte entspricht den Konvertierungsregeln.

Operator
 
+
-
 
+
-
*
/
%

Die folgende Tabelle stellt die entsprechenden Spezifikationen dar.

Operator Typisierung
  
+ N
- N
+ N,N
- N,N
* N,N
/ N,N
% N,N

Das folgende Beispiel führt eine einfache Berechnung durch. Dabei werden die Operationen miteinander verkettet. Das Ergebnis entspricht nach den Prioritätsstufen und Assoziativitäten dem Wert null.


public class MyClass
{
  public static void main(String[] args)
  {
    System.out.print(2*2+(-4));    
  }
}
    

0
    

» Vergleichsoperatoren nach oben «

Die Vergleichsoperatoren vergleichen Ausdrücke miteinander und liefern ein boolesches Ergebnis. Sie können auch zum Vergleich unterschiedlicher numerischer Datentypen verwendet werden. Beim Test von Objekttypen können auch die Operatoren für Gleichheit und Ungleichheit verwendet werden.

Operator
 
==
!=
 
<
>
<=
>=

Der Test ergibt entweder True oder False, je nachdem, ob die obige Bedingung erfüllt wird. Operiert wird immer mit zwei Operanden, die miteinander verglichen werden.

Die folgende Tabelle stellt die entsprechenden Spezifikationen dar.

Operator Typisierung
  
== P,P und R,R
!= P,P und R,R
< L,L
<= L,L
> L,L
>= L,L

Das folgende Beispiel führt einen einfachen Vergleich durch. Zwei Werte werden miteinander verglichen, wobei im Hintergrund der Integerwert in einen Long umgewandelt wird. Das Ergebnis in Form eines logischen Ausdrucks wird ausgegeben.


public class MyClass
{
  public static void main(String[] args)
  {
     int i = 10;
    long l = 20;    
		
    System.out.print(i<l);    
  }
}
    

true
    

» Inkrementierung und Dekrementierung nach oben «

Es gibt zwei weitere wichtige Operatoren. Diese erhöhen oder erniedrigen den Wert einer numerischen Variable um einen Stellenwert. Sie finden vorallem in Schleifen ihre Anwendung.

Operator
 
++
--

Die folgende Tabelle stellt die entsprechenden Spezifikationen dar.

Operator Typisierung
  
++ N
-- N

Das folgende Beispiel veranschaulicht sowohl die Inkrementierung als auch Dekrementierung einer Variable.


public class MyClass
{
  public static void main(String[] args)
  {
    int i = 1;
		
          System.out.println(i);		
    i++;  System.out.println(i);
    i--;  System.out.println(i);    
  }
}
    

1
2
1
    

» Präfix und Postfix nach oben «

In Verbindung mit dem vorhergehenden Punkt gibt es eine Erweiterung in Form der Präfixe und Postfixe. So können die Operatoren für die Inkrementierung und Dekrementierung einer Variable sowohl vor, als auch nachgestellt werden.

Dieses Thema hat uns bereits im Kapitel der Variablen beschäftigt, wonach wir nur noch einmal einen kurzen Rückblick geben möchten.

Wie wir schon einmal erwähnt hatten, so spielt dieses Konzept nur dann eine entscheidende Rolle, wenn die Operatoren in zusammengesetzten Anweisungen auftreten. Dann entscheidet die Position des Operators, ob zunächst die Inkrementierung beziehungsweise Dekrementierung durchgeführt wird oder nicht.

Das folgende Beispiel wird unser Problem noch einmal aufgreifen. Wir definieren zwei Variablen. In der ersten Anweisung zur Ausgabe handelt es sich um eine Präfixnotation, wodurch die Variable vor der Ausgabe hochgezählt wird. Erst in der zweiten Anweisung handelt es sich um den umgedrehten Fall, wie Anweisung drei bestätigen wird. Die Beispiele für die Dekrementierung verhalten sich analog.


public class MyClass
{
  public static void main(String[] args)
  {
    int a = 2;
    int b = 2;	    	
		
    System.out.println(++a);
    System.out.println(a++);
    System.out.println(a  );
    System.out.println(--b);
    System.out.println(b--);
    System.out.println(b  );
  }
}
    

3
3
4
1
1
0
    

» logische Operatoren nach oben «

Die logischen Operatoren vergleichen boolesche Werte miteinander. Im Gegensatz zu den Vergleichsoperatoren, die erst boolesche Ergebnisse produzieren, werden entsprechende Ergebnisse hier weiterverarbeitet.

Operator
 
!
&&
&
||
|
^

» Short Circuit Evaluation

Dieses Verfahren bestimmt die Art der Auswertung der Operanden. Verwendet eine Operation dieses Verfahren, so wird der weiter rechts stehende Ausdruck nur dann ausgewertet, wenn er für das Gesamtergebnis noch von Bedeutung ist. Dadurch kann man viele Vergleiche abkürzen.

» NICHT

Die Operation liefert stets den entgegengesetzten booleschen Wert.

Operand Ergebnis
  
TRUE FALSE
FALSE TRUE

» UND

Die Operation liefert nur dann True, wenn beide Operanden ebenfalls True sind.

rechter Operand linker Operand Ergebnis
   
TRUE TRUE TRUE
TRUE FALSE FALSE
FALSE TRUE FALSE
FALSE FALSE FALSE

» ODER

Die Operation liefert True, wenn einer der beiden Operanden True ist.

rechter Operand linker Operand Ergebnis
   
TRUE TRUE TRUE
TRUE FALSE TRUE
FALSE TRUE TRUE
FALSE FALSE FALSE

» ODER (exklusiv)

Die Operation liefert True, wenn die Operanden einen verschiedenen Wert haben.

rechter Operand linker Operand Ergebnis
   
TRUE TRUE FALSE
TRUE FALSE TRUE
FALSE TRUE TRUE
FALSE FALSE FALSE

Nachdem die logischen Operatoren im Detail besprochen wurden, wollen wir noch die spezifischen Eigenschaften der Operatoren darstellen.

Operator Typisierung
   
! L
&&L,L
& L,L
|| L,L
| L,L
^ L,L

Das folgende Beispiel vergleicht zwei boolesche Werte durch eine Und - Verknüpfung und gibt den entsprechenden Wert des Ergebnisses aus. Natürlich können auch Variablen verwendet werden.


public class MyClass
{
  public static void main(String[] args)
  {
    System.out.print(true && false);    
  }
}
    

false
    

» bitlogische Operatoren nach oben «

Diese Operatoren erlauben die Manipulation von Werten und Variablen auf Basis der Binärdarstellung. Alle numerischen Daten werden in ihrer Bitdarstellung betrachtet und jedes einzelne Bit kann durch spezielle Verknüpfungen manipuliert werden. Diese Verknüpfungen sind die Gleichen wie bei den logischen Operatoren, beziehen sich aber nun immer auf zwei korrespondierende Bitpaare.

Operator
 
~
&
|
^

» Komplement

Die Operation invertiert alle Bits. Alle bitlogischen Werte werden umgedreht.

Ausgangsbit Ergebnisbit Beispiel
   
  00110101
~ 11001010
          
TRUE FALSE
FALSE TRUE
  

» UND

Die Operation verknüpft ein Bitpaar mit einer logischen Und - Verknüfung.

erstes Bit zweites Bit Ergebnisbit Beispiel
     
  10011010
& 10101011
= 10001010
          
TRUE TRUE TRUE
TRUE FALSEFALSE
FALSETRUE FALSE
FALSEFALSEFALSE

» ODER

Die Operation verknüpft ein Bitpaar mit einer logischen Oder - Verknüfung.

erstes Bit zweites Bit Ergebnisbit Beispiel
     
  10011010
| 10101011
= 10111011
          
TRUE TRUE TRUE
TRUE FALSETRUE
FALSETRUE TRUE
FALSEFALSEFALSE

» ODER (exklusiv)

Die Operation verknüpft ein Bitpaar mit einer exklusiven Oder - Verknüfung.

erstes Bit zweites Bit Ergebnisbit Beispiel
     
  10011010
^ 10101011
= 00110001
          
TRUE TRUE FALSE
TRUE FALSETRUE
FALSETRUE TRUE
FALSEFALSEFALSE

Nachdem die bitlogischen Operatoren im Detail besprochen wurden, wollen wir noch die spezifischen Eigenschaften der Operatoren darstellen.

Operator Typisierung
  
~ I
& I,I
| I,I
^ I,I

Das folgende Beispiel definiert zwei Variablen mit den Werten eins und zwei. Durch die Verknüfung beider Variablen in ihrer Bitdarstellung ergibt sich eine eine neue Bitfolge. Dezimal hat diese den Wert drei.


public class MyClass
{
  public static void main(String[] args)
  {
    int i1 = 1;        // 00000001
    int i2 = 2;        // 00000010		
    int i3 = i1 | i2;  // 00000011
		
    System.out.print(i3);    
  }
}
    

3
    

» Verschiebungsoperatoren nach oben «

Die Verschiebungsoperatoren bilden an sich eine Gruppe mit den bitlogischen Operatoren, sollen hier aber separat behandelt werden. Sie ermöglichen es, die Bitdarstellung eines Wertes um eine bestimmte Anzahl von Positionen nach links oder rechts zu verschieben. Die fehlenden Stellen werden dabei mit Nullen wieder aufgefüllt.

Operator
 
<<
>>
>>>

» Linksverschiebung

Herbei wird die Bitfolge um eine bestimmte Anzahl von Stellen nach links verschoben. Die nun fehlenden Stellen werden durch Nullen aufgefüllt. Das Vorzeichen bleibt dabei unverändert.


00000001 << 4
00010000
    

» Rechtsverschiebung mit Vorzeichen

Herbei wird die Bitfolge um eine bestimmte Anzahl von Stellen nach rechts verschoben. Die nun fehlenden Stellen werden durch Nullen aufgefüllt. Das Vorzeichen bleibt dabei unverändert.


00000100 >> 2
00000001
    

» Rechtsverschiebung ohne Vorzeichen

Herbei wird die Bitfolge um eine bestimmte Anzahl von Stellen nach rechts verschoben. Die nun fehlenden Stellen werden durch Nullen aufgefüllt. Das Vorzeichen wird auf einen positiven Wert gesetzt.


00000100 >>> 2
00000001
    

Nachdem die Verschiebungsoperatoren im Detail besprochen wurden, wollen wir noch die spezifischen Eigenschaften der Operatoren darstellen.

Operator Typisierung
  
<< I,I
>> I,I
>>> I,I

» Zuweisungsoperatoren nach oben «

Die folgende Tabelle enthält alle Zuweisungsoperatoren von Java. Viele Varianten verbinden eine spezifische Operation direkt mit einer Zuweisung. So lassen sich viele Anweisungen weit kürzer fasssen.

Operator
 
   =
  +=
  -=
  *=
  /=
  %=
  &=
  |=
  ^=
 <<=
 >>=
>>>=

Durch diese Verwendung erspart man sich viel Schreibarbeit. Das folgende Beispiel demonstriert zwei äquivalente Varianten einer mathematischen Operation.


public class MyClass
{
  public static void main(String[] args)
  {
    int a = 1;
    int b = 2;
				
    a += b;  //  a = a + b;		
    System.out.println(a);      
  }
}
    

3
    

» weitere Operatoren nach oben «

Java kennt noch einige weitere Operatoren, welche sich jedoch nicht signifikant in eine Kategorie einordnen lassen. Daher wollen wir diese separat behandeln.


» Bedingungsoperator

Der Bedingungsoperator ist der einzige dreistellige Operator. Der erste Operand erwartet einen logischen Ausdruck, in dessen Abhängigkeit entweder der zweite oder dritte Operand zurückgeliefert wird. Im Falle des True - Wertes wird daher der erste Operand verwendet, ansonsten der zweite.

Operator Typisierung
  
? : L,A,A

Das folgende Beispiel wird den zweiten Operanden ausgeben, da die Bedingung des ersten Operanden True ergibt.


public class MyClass
{
  public static void main(String[] args)
  {
    boolean b = true;
    System.out.print(b?1:2);      
  }
}
    

1
    

» Instanzbestimmung

Der Instanceof - Operator ist einer der wichtigsten Operatoren in Verbindung mit der objektorientierten Programmierung. Er kann ermitteln, zu welcher Klasse ein bestimmtes Objekt gehört.

Der Operator verwendet Referenzen als Operatoren. Er liefert True, wenn der erste Operand eine Innstanz der entsprechenden Klasse (zweiter Operand), oder einer ihrer Unterklassen ist.

Operator Typisierung
   
instanceofR,R

Der Operator wird detailliert im Kapitel zehn beschrieben werden.

» Indexoperator

Über den Indexoperator (eckige Klammern) wird ein spezielles Element eines Arrays referenziert. Er erwartet stets einen ganzzahligen Wert, der dem Arrayelelement entspricht. Der zurückgegebene Typ und Wert deckt sich mit dem Datentyp des verwendeten Arrays.

» Methodenaufruf

Durch die runden Klammern wird der Aufruf einer Methode gekennzeichnet. Diese Art von Operator übernimmt dabei entsprechende Parameter oder bleibt gänzlich leer. Mit Methoden beschäftigt sich ebenfalls Kapitel zehn im Detail.

» Elementzugriff

Um auf Elemente einer Klasse zugreifen zu können, wird der Punktoperator verwendet. Er trennt die Angaben von Klassen, Subklassen und Elementen des Arrays. Ebenfalls Thema des Kapitels zehn.

» Verkettung von Strings

Strings sind als spezielle Datentypen von Java anzusehen. Es ist möglich, durch eine modifizierte Variante des Additionsoperators Strings miteinander zu verketten. Diesem Thema widmet sich das letzte Kapitel unserer Einführung, wo uns auch dieses Thema noch einmal im Detail beschäftigen soll.

Operator Typisierung
  
+ S,I

» Allokation von Speicher

Alle Objekte in Java müssen dynamisch auf dem Speicher angelegt werden. Das geschieht durch die Verwendung des New - Operators. Die Kapitel zehn und dreizehn behandeln dieses Thema detaillierter, als es an dieser Stelle möglich wäre.

» Konvertierung

Die Konvertierung von Variablen in andere Datentypen haben wir bereits detailliert behandelt. Der Vollständigkeit halber finden Sie hier noch einmal die exakte Spezifikation des Operators.

Operator Typisierung
  
(Typ) A

» Übersicht aller Operatoren nach oben «

Abschließend finden Sie hier eine Zusammenfassung aller im Detail behandelten Operatoren. Diese schließt alle Stufen der Kategorisierung mit ein.

Operator Typisierung
   
++ N
-- N
+ N
- N
~ I
! L
(Typ) A
* N,N
/ N,N
% N,N
+ N,N
- N,N
+ S,I
<< I,I
>> I,I
>>> I,I
< L,L
<= L,L
> L,L
>= L,L
instanceofR,R
== R,R und P,P
!= R,R und P,P
& I,I und L,L
^ I,I und L,L
| I,I und L,L
&&L,L
|| L,L
?: L,A,A
= V,A
+= V,N
-= V,N
*= V,N
/= V,N
%= V,N
&= N,N und L,L
|= N,N und L,L
^= N,N und L,L
<<= V,I
>>= V,I
>>>= V,I

« Kapitel Kapitelübersicht nach oben Kapitel »