条件选择

条件选择

if-else

if

一个if语句包含一个布尔表达式和一条或多条语句,if语句的语法如下:

if(布尔表达式)
{
   //如果布尔表达式为true将执行的语句
}

如果布尔表达式的值为true,则执行if语句中的代码块,否则执行if语句块后面的代码。

public class Test {

   public static void main(String args[]){
      int x = 10;

      if( x < 20 ){
         System.out.print("这是 if 语句");
      }
   }
}

if语句后面可以跟else语句,当if语句的布尔表达式值为false时,else语句块会被执行。

if(布尔表达式){
   //如果布尔表达式的值为true
}else{
   //如果布尔表达式的值为false
}
public class Test {

   public static void main(String args[]){
      int x = 30;

      if( x < 20 ){
         System.out.print("这是 if 语句");
      }else{
         System.out.print("这是 else 语句");
      }
   }
}

这里我们可以用用forif绘制一个图形

 * * * * * * * * * * * * *

 *           @           *

 *         @   @         *

 *       @       @       *

 *     @           @     *

 *   @               @   *

 * @                   @ *

 *   @               @   *

 *     @           @     *

 *       @       @       *

 *         @   @         *

 *           @           *

 * * * * * * * * * * * * *
import java.io.*;
import java.util.Scanner;

public class IfelseP {
    public void draw(int h) {
        for (int m = 0; m <= h + 1; m++) {
            for (int n = 0; n <= h + 1; n++) {
                if ((m == 0 && n >= 0) || (n == 0 && m > 0) || (m == h + 1 && h + 1 > n && n > 0)
                        || (n == h + 1 && m > 0)) {
                    System.out.print(" ");
                    System.out.print("*");
                } else if (n == (h + 3) / 2 - m || n == (h - 1) / 2 + m || n == m - (h - 1) / 2
                        || n == (3 * h + 1) / 2 - m) {
                    System.out.print(" ");
                    System.out.print("@");
                } else {
                    System.out.print(" ");
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
        /*
         * for (int i=1;i<=h;i++){ //逐行打印 for (int j=1;j<=h;j++){
         * //每行打印个数数行数保持一致 //下面是菱形四天便的函数,在边上的坐标点打印*,否则打印空格 if
         * (j==(h+3)/2-i||j==(h-1)/2+i||j==i-(h-1)/2||j==(3*h+1)/2-i){
         * System.out.print("*"); }else { System.out.print(" "); } }
         * System.out.println(); }
         */ }

    public static void main(String[] args) {
        IfelseP p = new IfelseP();
        System.out.println("请输入大于1的奇数:");
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        p.draw(a);
    }
}

if…else if…else语句

if语句后面可以跟else ifelse语句,这种语句可以检测到多种可能的情况。使用if,else if,else语句的时候,需要注意下面几点:

  • if语句至多有1else语句,else语句在所有的else if语句之后。
  • if语句可以有若干个else if语句,它们必须在else语句之前。
  • 一旦其中一个else if语句检测为true,其他的else if以及else语句都将跳过执行。
if(布尔表达式 1){
   //如果布尔表达式 1的值为true执行代码
}else if(布尔表达式 2){
   //如果布尔表达式 2的值为true执行代码
}else if(布尔表达式 3){
   //如果布尔表达式 3的值为true执行代码
}else {
   //如果以上布尔表达式都不为true执行代码
}
public class Test {
   public static void main(String args[]){
      int x = 30;

      if( x == 10 ){
         System.out.print("Value of X is 10");
      }else if( x == 20 ){
         System.out.print("Value of X is 20");
      }else if( x == 30 ){
         System.out.print("Value of X is 30");
      }else{
         System.out.print("这是 else 语句");
      }
   }
}

// Value of X is 30

嵌套的ifelse语句

使用嵌套的ifelse语句是合法的。也就是说你可以在另一个if或者else if语句中使用if或者else if语句。

if(布尔表达式 1){
   ////如果布尔表达式 1的值为true执行代码
   if(布尔表达式 2){
      ////如果布尔表达式 2的值为true执行代码
   }
}

你可以像if语句一样嵌套else if…else。

public class Test {

   public static void main(String args[]){
      int x = 30;
      int y = 10;

      if( x == 30 ){
         if( y == 10 ){
             System.out.print("X = 30 and Y = 10");
          }
       }
    }
}

// X = 30 and Y = 10

switch

switch case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。

switch(expression){
    case value :
       //语句
       break; //可选
    case value :
       //语句
       break; //可选
    //你可以有任意数量的case语句
    default : //可选
       //语句
}

基础规则

switch case语句有如下规则:

  • switch语句中的变量类型可以是:byte、short、int或者char。从Java SE 7开始,switch支持字符串String类型了,同时case标签必须为字符串常量或字面量。
  • switch语句可以拥有多个case语句。每个case后面跟一个要比较的值和冒号。
  • case语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
  • 当变量的值与case语句的值相等时,那么case语句之后的语句开始执行,直到break语句出现才会跳出switch语句。
  • 当遇到break语句时,switch语句终止。程序跳转到switch语句后面的语句执行。case语句不必须要包含break语句。如果没有break语句出现,程序会继续执行下一条case语句,直到出现break语句。
  • switch语句可以包含一个default分支,该分支一般是switch语句的最后一个分支(可以在任何位置,但建议在最后一个default在没有case语句的值和变量值相等的时候执行。default分支不需要break语句。

switch case执行时,一定会先进行匹配,匹配成功返回当前case的值,再根据是否有break,判断是否继续输出,或是跳出判断。

public class Test {
   public static void main(String args[]){
      //char grade = args[0].charAt(0);
      char grade = 'C';

      switch(grade)
      {
         case 'A' :
            System.out.println("优秀");
            break;
         case 'B' :
         case 'C' :
            System.out.println("良好");
            break;
         case 'D' :
            System.out.println("及格");
            break;
         case 'F' :
            System.out.println("你需要再努力努力");
            break;
         default :
            System.out.println("未知等级");
      }
      System.out.println("你的等级是 " + grade);
   }
}

如果case语句块中没有break语句时,JVM并不会顺序输出每一个case对应的返回值,而是继续匹配,匹配不成功则返回默认case

public class Test {
   public static void main(String args[]){
      int i = 5;
      switch(i){
         case 0:
            System.out.println("0");
         case 1:
            System.out.println("1");
         case 2:
            System.out.println("2");
         default:
            System.out.println("default");
      }
   }
}

switch的底层转化

switch中只能使用整型,比如byte,short,char以及int,其对于其他类型的支持往往是基于语法糖实现的。

/** * Java Program to demonstrate how string in switch functionality is implemented in * Java SE 7 release. */
public class StringInSwitchCase {

  public static void main(String[] args) {
    String mode = args[0];
    switch (mode) {
      case "ACTIVE":
        System.out.println("Application is running on Active mode");
        break;
      case "PASSIVE":
        System.out.println("Application is running on Passive mode");
        break;
      case "SAFE":
        System.out.println("Application is running on Safe mode");
    }
  }
}

反编译之后,我们可以看到Java为我们添加了如下的语法糖:

public class StringInSwitchCase {

  public StringInSwitchCase() {}

  public static void main(string args[]) {
    String mode = args[0];
    String s;
    switch ((s = mode).hashCode()) {
      default:
        break;
      case -74056953:
        if (s.equals("PASSIVE")) {
          System.out.println("Application is running on Passive mode");
        }
        break;
      case 2537357:
        if (s.equals("SAFE")) {
          System.out.println("Application is running on Safe mode");
        }
        break;
      case 1925346054:
        if (s.equals("ACTIVE")) {
          System.out.println("Application is running on Active mode");
        }
        break;
    }
  }
}

switch的空判断

Java switch参数不能是nullswicth(null)会报 java.lang.NullPointerException 异常,这里在前文已经介绍过,因为switch会调用hashCode来获取比较值。

String param = null;
switch (param) {
    case "null":
        System.out.println("null");
        break;
    default:
        System.out.println("default");
}

// Exception in thread "main" java.lang.NullPointerException

因此对String或者enum类型的switch变量类型,要预先进行null判断。

下一页