1. 多肢選択演算子:switch

Java には、grandpappy (C++) から継承したもう 1 つの興味深い演算子があります。私たちはその声明について話していますswitch。これを多肢選択演算子と呼ぶこともできます。少し面倒に見えます:

switch(expression)
{
   case value1: code1;
   case value2: code2;
   case value3: code3;
}

式または変数は括弧内に示されます。式の値が の場合value1、Java マシンは実行を開始しますcode1。式が に等しい場合value2、実行は にジャンプしますcode2。式が に等しい場合value3、 がcode3実行されます。

例:

コード コンソール出力
int temperature = 38;

switch(temperature)
{
   case 36: System.out.println("Low");
   case 37: System.out.println("Normal");
   case 38: System.out.println("High");
} 
High

2.breakでのステートメントswitch

ステートメントの重要な特徴switchは、プログラムが必要な行 (必要なコード ブロック) に単純にジャンプし、その後、 の終わりまですべてのコード ブロックを実行することですswitch。の値に対応するコード ブロックだけでなくswitch、 の終わりまでのすべてのコード ブロックswitch

例:

コード コンソール出力
int temperature = 36;

switch(temperature)
{
   case 36: System.out.println("Low");
   case 37: System.out.println("Normal");
   case 38: System.out.println("High");
} 
Low
Normal
High

温度が 36 度の場合、プログラムはステートメントに入りswitch、最初のコード ブロックにジャンプして実行し (最初のケース)、その後残りのコード ブロックを順調に実行します。

1 つのコード ブロック (一致するケースに関連付けられたコード ブロック) だけを実行する場合は、そのブロックをステートメントで終了する必要がありますbreak

例:

コード コンソール出力
int temperature = 36;

switch(temperature)
{
   case 36:
      System.out.println("Low");
      break;
   case 37:
      System.out.println("Normal");
      break;
   case 38:
      System.out.println("High");
}
Low

そのブロックは、break ステートメントの有無にかかわらず最後のブロックであるため、ステートメントbreakの最後の場合は省略できます。switch


3. デフォルトのアクション:default

もう一つ重要な点があります。リストされているケースがswitch括弧内の式に一致しない場合はどうなりますか?

一致するケースが見つからない場合、switchステートメントの残りの部分はスキップされ、プログラムはステートメントを終了する中括弧の後に実行を続行しますswitch

つまり、switchステートメントをステートメント内の else 分岐のように動作させることもできますif-else。これを行うには、defaultキーワードを使用します。

caseブロック内のいずれの もswitch式の値と一致せず、 にブロックswitchがある場合はdefault、デフォルトのブロックが実行されます。例:

コード コンソール出力
int temperature = 40;
switch(temperature)
{
   case 36:
      System.out.println("Low");
      break;
   case 37:
      System.out.println("Normal");
      break;
   case 38:
      System.out.println("High");
      break;
   default:
      System.out.println("Call an ambulance");
}
Call an ambulance

4. 比較switchif-else

このswitchステートメントはステートメントに似ていますがif-else、より複雑であるだけです。

ステートメントのコードは、いつでもswitch複数のステートメントとして書き直すことができますif。例:

スイッチ付きコード if-else を使用したコード
int temperature = 40;
switch(temperature)
{
   case 36:
      System.out.println("Low");
      break;
   case 37:
      System.out.println("Normal");
      break;
   case 38:
      System.out.println("High");
      break;
   default:
      System.out.println("Call an ambulance");
} 
int temperature = 40;

if (temperature == 36)
{
   System.out.println("Low");
}
else if (temperature == 37)
{
   System.out.println("Normal");
}
else if (temperature == 38)
{
   System.out.println("High");
}
else
{
   System.out.println("Call an ambulance");
}

左側のコードは右側のコードとまったく同じように機能します。

ステートメントにさまざまな複雑な式がそれぞれ個別に含まれているif-else場合は、複数のステートメントを連鎖させることが推奨されます。if



5. ステートメントではどのような表現を使用できますかswitch?

caseすべての型をステートメント内のラベルとして使用できるわけではありませんswitch。次のタイプのリテラルを使用できます。

  • 整数型: byteshortintlong
  • char
  • String
  • 任意のenumタイプ

他のタイプをケースラベルとして使用することはできません

enumステートメント内での使用例switch:

Day day = Day.MONDAY;
switch (day)
{
   case MONDAY:
      System.out.println("Monday");
      break;
   case TUESDAY:
      System.out.println("Tuesday");
      break;
   case WEDNESDAY:
      System.out.println("Wednesday");
      break;
   case THURSDAY:
      System.out.println("Thursday");
      break;
   case FRIDAY:
      System.out.println("Friday");
      break;
   case SATURDAY:
      System.out.println("Saturday");
      break;
   case SUNDAY:
      System.out.println("Sunday");
      break;
}

enum注: ステートメント内で を使用する場合switch、ラベルの各値の前にクラス名を記述する必要はありませんcase。値を書き込むだけで十分です。