tement in the block will not be 
executed; the whole if block will be skipped.  Now consider the case in 
which we don't use the curly braces: 
1. if ( x > 0 ) 
2. System.out.println("x is greater than zero."); 
3. System.out.println("Who cares what x is."); 
Line 2 will be executed only if x is greater than 0, whereas line 3 will  
always be executed independent of the value of x . Remember that the  
<expression> in the parentheses of if() must evaluate to a boolean
 value:  true or false . Also remember that = is an assignment operator 
and not the  comparison operator. For example, if(x=y) is illegal 
whereas the legal form is  if(x==y) . However, if x and y are boolean , 
then if(x=y) will compile but will  give the wrong results. As an 
illustration, consider the code : 
1. class IfTest { 
2. public static void main(String[] args) 
3. { 
4. boolean b1 = false; 
5. boolean b2 = true; 
6. if(b1=b2){ 
7. System.out.println("The value of b1: " + b1); 
8. } 
9. } 
10.} 
the
 code will compile, but it will change the value of b1 from false to 
true  because it assigns the value of b2 to b1 , and now, ecause b1 is 
true , the test  will pass, and the body of the if block will be 
executed. The output from the  code: The value of b1: true 
¦ Note The
 legal argument type of an if() statement is a  boolean . That means the
 expression in the parentheses of the if() statement  must result in a 
boolean value. 
The if construct handles a very simple situation 
and takes an action only if  the condition is true . A bit more 
sophisticated case will do something if a  condition is true , else do 
something else. 
The if-else Construct 
You can handle two blocks of code with the if-else construct. If a 
condition  is true , the first block of code will be executed, otherwise
 the second block  of code will be executed. The syntax for the if-else 
construct follows: 
if( <expression> ) { 
// if <expression> returns true, statements in this block are executed.  
} 
else { 
// if <expression> is false, then statements in this block will be  executed. 
} 
For example, consider the following code fragment: 
if ( x > 0 ) { 
System.out.println("x is greater than zero."); 
} 
else { 
System.out.println("x is not greater than zero."); 
} 
If
 the value of x is greater than zero, the output of this code is : x is 
 greater than zero, Otherwise the output is, x is not greater than zero.
 
The if and if-else constructs can test only one expression, 
which may contain  one or more conditions. However, you may encounter 
situations in which multiple  conditional expressions exist and you want
 to test one after the other. You  handle this type of situation with 
the if-else if construct . 
The if-else if Construct 
With the if-else if construct you can handle multiple blocks of code, and  
only one of those blocks will be executed at most. The syntax for the 
if-else  construct follows: 
if( <expression1> ) { 
// if <expression1> returns true, statements in this block are  executed. 
} 
else if ( <expression2>) { 
// if <expression1> is false and <expression2> is true, 
then statements in this block will be executed. 
} 
else if (<expression3>) { 
// if <expression1> is false, and <expression2> is false, and  <expression3> is 
true, then statements in this block will be executed. 
} 
Note that
 in an if-else if construct, the expressions  will be tested one by one 
starting from the top. If an expression returns true ,  the block 
following the expression will be executed and all the following else  if
 blocks will be skipped. Also note that it is possible that no block 
will be  executed, a possibility that does not exist with the if-else 
construct. However,  Java does offer a construct that enables you to 
handle multiple blocks of code  and ensure that one of them will 
certainly be executed, discussed next. 
The if-else if-else Construct 
The syntax for the if-else if-else construct follows: 
if( <expression1> ) { 
// if <expression1> returns true, statements in this block are  executed. 
} 
else if (<expression2>) { 
// if <expression1> is false and <expression2> is true, 
then statements in this block will be executed. 
} 
else if (<expression3>) { 
// if <expression1> is false and <expression2> is false, and 
<expression3> is true, then statements in this block 
will be executed. 
} 
else { 
// if the expression in the if statement and the expressions 
in all the else if statements were false, then the statements 
in this block will be executed. 
} 
Keep in mind that the condition in the if or else if statement can be a  
compound condition, such as: if(i > 2 && j < 100) 
However, the condition should always evaluate to a boolean . 
Summary of the if Constructs 
The following list summarizes the if family of constructs: 
•
 There are two constructs for a single expression: if where it is 
possible  that no block will be executed, and if-else where one block 
will certainly be  executed. 
• There are also two constructs 
corresponding to multiple expressions:  if-else if where it is possible 
that no block will be executed, and if-else  if-else where one block 
will certainly be executed. 
• The first construct is always if . 
•
 Any of these constructs may be nested inside any other construct. The  
condition for the inner construct will be tested only if the condition 
for the  outer construct was tested and was true . 
Again, consider the if-else if construct, and assume that it finds the  
expression in an else if statement to be true . In this case, the code 
block  related to that else if statement will be executed and all the 
other following  blocks will be ignored. What if you want all or some of
 the following blocks  executed as well after a block with a true 
expression is found? You can handle  this situation with another 
selection statement, the switch statement. 
The switch Statement 
The switch statement is used to make the choices for multiple blocks with 
the  possibility of executing more than one of them. Let's start with an
 example:  
switch (x){ 
case 5: 
System.out.println("The value of x is 5." ); 
break; 
case 4: 
System.out.println("The value of x is 4." ); 
case 7: 
System.out.println("The value of x is 7." ); 
case 2: 
System.out.println("The value of x is 7." ); 
case 1: 
System.out.println("The value of x is 1." ); 
default: 
System.out.println("The value of x is default."); 
} 
In this code, x is an integral variable (any integral variable except long
 )  with a certain value assigned to it. If the value of x is 5, the 
print statement  under case 5 is executed. Following this, the break 
statement is executed.  Execution of the break statement moves the 
execution control to the first line  after the switch block. If the 
value of x is not 5, the next case is tested;  that is, it would be 
checked if the value of x is equal to 4. If it is, the  print statement 
under case 4 is executed. Because there is no break statement  after 
this, all the following statements under all case labels, including the 
 default label, would be executed. This is called a fall through . If  the value of x is not equal to any value following any case label, the  statement(s) under label default are executed. 
For example, for x=1 , the preceding code will generate the following output:  The value of x is 1, The value of x is default. 
The default label could go anywhere in the switch block; it does not have 
to  be put at the end. In this case, it was executed because there was 
no break  statement in the previous block executed before it. 
Note In the switch statement, the default  case does not have to appear at the end. It can appear anywhere in the switch  block. 
If  the default case is not at the end, and is executed, the execution can 
 fall through in this case as well if there is no break statement in it.
 For  example, the following is a perfectly valid code fragment: 
int x=3 
switch (x) { 
case 1: 
System.out.println("The value of x is 1." ); 
break; 
case 2: 
System.out.println("The value of x is 2." ); 
default: 
System.out.println("The value of x is default."); 
case 4: 
System.out.println("The value of x is 4." ); 
} 
It will generate the following output: The value of x is default, The value  of x is 4. 
Remember the following about the default block: 
• The default does not have to be at the end of the switch . 
• When the execution control faces a default block, it executes it. 
• If there is no break statement in the default block, there will be fall  through just like in any other block. 
The  comparison of values following the case labels with the value of the  
argument of switch determines the execution path. Once the execution 
path of a  particular case is chosen, the execution falls through until 
it runs into a  break statement. 
Note the following: 
• The argument of switch() must be one of the following types: byte , short ,  char , int , or enum . 
• The argument of case must be a literal integral type number, such as 2,  or  a literal number expression that could be evaluated at compile time, such as  2+3. 
• There should be no duplicate case labels; that is, the same value cannot be  used twice. 
• The variable x in switch(x) cannot be declared inside the parentheses. 
To  illustrate the last point, the following statement is illegal: 
switch ( int x=2;) 
However, a simple mathematical expression inside the parentheses is fine,  such as the following: 
switch ( x+ y ) 
or 
switch(x++) 
where
 x and y are already declared variables of the correct type. So, the  
legal argument type of a switch statement is int , or any other type 
that can be  promoted to int : byte , short , or char . If you use some 
other type, such as  long , float , or double , you will receive a 
compiler error. Also be careful  about the implications of this. For 
example, the following code fragment is  illegal because one of the case
 labels is too big to be a byte : 
byte x=5; 
switch(x){ 
case 5 : System.out.println("five"); 
case 130 : System.out.println(" one thirty "); // compiler error 
} 
This generates a compiler error because the compiler will look at 130 as an  int , which can't fit into a byte . 
Also note that an enum , the new kid on the block, can also be used as a  legal argument for a switch statement. 
¦ Note The
 legal argument types of a switch statement are  byte , short , char , 
int , and enum . You will receive a compiler error if you  use any other
 type. 
To summarize, starting from the top of the switch block, 
each non-default  case is tested. If a case turns out to be true , the 
tatements in that case and  all the following cases are executed until a
 break statement is encountered. If  none of the non-default cases is 
true , and the execution control faces the  default case, then the 
statements in the default case and all the following  cases are executed
 until a break statement is encountered. The default statement  can be 
anywhere in the switch block. To illustrate this, presents a complete  
runnable example of a switch statement that uses an enum as an argument.
 
1. class SwitchTest { 
2. public static void main(String[] args) 
3. { 
4. Signal sig = Enum.valueOf(Signal.class, args[0].toUpperCase()); 
5. switch(sig){ 
6. case RED: 
7. sig.redSays(); 
8. break; 
9. case YELLOW: 
10. sig.yellowSays(); 
11. case bGREEN: 
12. sig.greenSays(); 
13. } 
14. } 
15. } 
16. enum Signal {RED, YELLOW, GREEN; 
17. public void redSays(){ 
18. System.out.println("STOP"); 
19. } 
20. public void yellowSays(){ 
21. System.out.println("STOP if it is safe to do so."); 
22. System.out.println("Otherwise"); 
23. } 
24. public void greenSays(){ 
25. System.out.println("Keep going."); 
26. } 
27. } 
As an example, you can execute this code with the following command: java  SwitchTest yellow , The output follows: 
STOP if it is safe to do so. Otherwise Keep going.
No comments:
Post a Comment