Bedingte Ausdrücke
Um nützliche Programme zu schreiben, müssen wir fast immer Bedingungen prüfen und das Verhalten des Programms entsprechend ändern. Bedingte Anweisungen geben uns diese Möglichkeit.
If-Else-Bedingter Ausdruck
Die einfachste Form ist die If-Else-Anweisung:
Beispiel:
Schreiben Sie den folgenden Code in die Datei /home/labex/project/ifelseTest.java
:
public class ifelseTest{
public static void main(String[] args){
int x = 1;
if (x > 0) {
System.out.println("x is positive");
}
else{
System.out.println("x is non-positive");
}
}
}
Ausgabe:
Führen Sie die Datei ifelseTest.java
mit den folgenden Befehlen im Terminal aus:
javac /home/labex/project/ifelseTest.java
java ifelseTest
Sehen Sie sich die Ausgabe an:
x is positive
Der Ausdruck in Klammern wird Bedingung genannt. Wenn diese wahr ist, werden die Anweisungen in den geschweiften Klammern nach if
ausgeführt. Wenn die Bedingung nicht wahr ist, werden die Anweisungen in den geschweiften Klammern nach else
ausgeführt. Wenn kein else
vorhanden ist und die if
-Bedingung falsch ist, werden die Anweisungen, falls vorhanden, nach der If-Else-Anweisung ausgeführt. Die Bedingung kann beliebige Vergleichsoperatoren (auch Relationsoperatoren genannt) enthalten:
Beispiel:
if (x == y){ } // x equals y
if (x!= y){ } // x is not equal to y
if (x > y) { } // x is greater than y
if (x < y) { } // x is less than y
if (x >= y){ } // x is greater than or equal to y
if (x <= y){ } // x is less than or equal to y
Obwohl Ihnen diese Operationen wahrscheinlich vertraut sind, unterscheidet sich die Syntax, die Java verwendet, ein wenig von mathematischen Symbolen wie =, ≠ und ≤. Ein häufiger Fehler ist die Verwendung eines einzelnen Gleichzeichens (=
) anstelle eines doppelten Gleichzeichens (==
). Denken Sie daran, dass =
der Zuweisungsoperator und ==
ein Vergleichsoperator ist. Außerdem gibt es kein =<
oder =>
.
Die beiden Seiten eines bedingten Operators müssen vom gleichen Typ sein. Sie können nur ints mit ints und doubles mit doubles vergleichen. Die Operatoren ==
und !=
funktionieren mit String
s, aber sie tun nicht, was Sie erwarten. Und die anderen Relationenoperatoren funktionieren überhaupt nicht mit Strings.
Ein Beispiel: Wenn der Rest bei der Division von x
durch 2
gleich 0
ist, wissen wir, dass x
eine gerade Zahl ist, und dieser Code gibt eine entsprechende Nachricht aus. Wenn die Bedingung falsch ist, wird die zweite print
-Anweisung ausgeführt. Da die Bedingung entweder wahr oder falsch sein muss, wird genau eine der Alternativen ausgeführt. Wenn Sie glauben, dass Sie oft die Parität (Gerade- oder Ungeradezahl) von Zahlen prüfen möchten, können Sie diesen Code in einer Methode “verpacken”, wie folgt:
Beispiel:
Schreiben Sie den folgenden Code in die Datei /home/labex/project/conditionTest.java
:
public class conditionTest
{
public static void printParity(int x) {
if (x%2 == 0) {
System.out.println(x + " is even");
} else {
System.out.println(x + " is odd");
}
}
public static void main(String[] args){
printParity(17);
printParity(18);
}
}
Ausgabe:
Führen Sie die Datei conditionTest.java
mit den folgenden Befehlen im Terminal aus:
javac /home/labex/project/conditionTest.java
java conditionTest
Sehen Sie sich die Ausgabe an:
17 is odd
18 is even
Jetzt haben Sie eine Methode namens printParity
, die für jede beliebige Ganzzahl, die Sie angeben möchten, eine entsprechende Nachricht ausgibt. In main
würden Sie diese Methode aufrufen. Denken Sie immer daran, dass Sie bei der Aufrufung einer Methode nicht die Typen der Argumente deklarieren müssen. Java kann herausfinden, welche Typen es sind. Sie sollten den Versuch widerstehen, Dinge wie printParity(int 3)
zu schreiben. Darüber hinaus können Sie auch eine bedingte Anweisung in eine andere verschachteln.
Beispiel:
Schreiben Sie den folgenden Code in die Datei /home/labex/project/nestedConditionTest.java
:
public class nestedConditionTest{
public static void main(String[] args){
int x = 0; // you can try x = 1, x = -1
if (x == 0) {
System.out.println("x is zero");
}
else {
if (x > 0) {
System.out.println("x is positive");
}
else {
System.out.println("x is negative");
}
}
}
}
Ausgabe:
Führen Sie die Datei nestedConditionTest.java
mit den folgenden Befehlen im Terminal aus:
javac /home/labex/project/nestedConditionTest.java
java nestedConditionTest
Sehen Sie sich die Ausgabe an:
x is zero
Es gibt jetzt eine äußere bedingte Anweisung, die zwei Zweige enthält. Der erste Zweig enthält eine einfache print
-Anweisung, aber der zweite Zweig enthält eine weitere bedingte Anweisung, die ihrerseits zwei Zweige hat. Beide dieser Zweige sind print
-Anweisungen, aber sie hätten auch bedingte Anweisungen sein können.
Einrückungen helfen, die Struktur schön und verständlich zu gestalten, aber dennoch werden verschachtelte bedingte Anweisungen sehr schnell schwer lesbar. Vermeiden Sie sie, wenn möglich. Andererseits ist diese Art von verschachtelter Struktur üblich, und wir werden sie nochmal sehen. Also sollten Sie sich daran gewöhnen.
Switch-Case-Bedingter Ausdruck
Die Switch-Case-Anweisung ist ein weiterer bedingter Ausdruck. Die Syntax der Switch-Case-Anweisung sieht wie folgt aus:
Beispiel:
// value type can be byte, short, int, char, String, but long type is not correct.
switch (variable or an value expression)
{
// case value must be a constant value
case value1:
// code
;
case value2:
// code
;
default:
// code
;
}
Beispiel:
Schreiben Sie den folgenden Code in die Datei /home/labex/project/switchTest.java
:
public class switchTest
{
public static void main(String[] args){
// you can change i = 2, then try again
int i = 2;
switch(i)
{
case 1:
System.out.println(1);
break;
case 2:
System.out.println(2);
// if no break expression, sometimes you'll get a confusing answer.
// you can try deleting the break expression and see what happens.
break;
// if none of the above matches, execute the default statements
default:
System.out.println("default");
break;
}
}
}
Ausgabe:
Führen Sie die Datei switchTest.java
mit den folgenden Befehlen im Terminal aus:
javac /home/labex/project/switchTest.java
java switchTest
Sehen Sie sich die Ausgabe an:
2