找回密码
 加入后院

QQ登录

只需一步,快速开始

搜索
查看: 728|回复: 0

一、switch语句的使用

[复制链接]
发表于 2015-5-5 11:23 | 显示全部楼层 |阅读模式
一、switch语句的使用( D6 d* u" o  z
而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和7 ?: c! K4 ~; I9 c' ?9 W2 V

; Z' }) _* I* X原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始" E* \- r! z- V' i6 D

1 ~# V) L- ~: R4 P' v类型:字符,字节,短,和整数(在数字和字符串的讨论)。) G8 i# x7 K) u; E
下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值( ?- y/ u$ M* [, N+ {& c# H
. T$ w3 e; ?) G. r
,使用switch语句。8 V& i2 v9 Q7 v6 L
public class SwitchDemo {
, M3 s+ ?, s% q4 B0 L/ [    public static void main(String[] args) {5 i6 \& S2 j# R" j, H( M/ c
% c: {- W5 g8 p. j; W4 |2 ^
        int month = 8;* Q( J" z+ x  B. @+ Q! m
        String monthString;
, Z' z9 @3 L/ A! ^. ?        switch (month) {
# h0 N3 E( b- n6 Z/ P. E            case 1:  monthString = "January";' L* G+ M9 `/ K- U" k' r. {
                     break;
! P5 ^, C4 H4 F- m# h            case 2:  monthString = "February";: u& v7 a+ r, \! w( C
                     break;
$ Q* g9 e1 F! F! b            case 3:  monthString = "March";
3 W- T3 |% w5 I# s( L                     break;# ]* [7 ~7 Q7 B' ]+ i- F0 i/ F3 k
            case 4:  monthString = "April";9 F: v# |& F; }$ }! R  g0 }
                     break;
$ @1 T) R; g- c' D/ @/ z6 W            case 5:  monthString = "May";
+ S2 c) |) o+ z. N$ N! d                     break;
" d/ |9 r* i3 ~            case 6:  monthString = "June";+ Y3 V2 ?  e% Z! e7 v
                     break;
1 z3 y$ I2 ]0 c* C/ S/ H9 G            case 7:  monthString = "July";7 P3 @# b# l2 R3 a% ^# S: A
                     break;
0 y2 c! M  x6 M' \- m            case 8:  monthString = "August";1 d& K# B+ I- t! [
                     break;' s4 u: h9 {' W8 W
            case 9:  monthString = "September";7 c" Y$ k, X/ ~3 h
                     break;" o, }- W; o4 j* r5 u9 P
            case 10: monthString = "October";7 h3 @( D0 r& r  L! ?
                     break;3 H, K; Q" n9 ]* Y) s1 a8 }
            case 11: monthString = "November";
, d( c) w) |9 c* E7 ~8 ^                     break;
7 x" B- p8 e' i% j- H& o5 e6 i$ v& j            case 12: monthString = "December";
( e2 {  f6 }) {* z: B' v                     break;
4 j' u) A; ~1 d+ E% v: Q, A            default: monthString = "Invalid month";
6 F: c! V9 X4 W3 L8 A                     break;2 r' @) y/ d+ D" p' r5 i) u! @- h! e/ F
        }
/ p1 `4 W- a  \7 A        System.out.println(monthString);
  W* r6 E- c! x  ]( n3 E    }
& e# ~$ x7 T2 R2 _) @& g}
5 F0 f! R% {: a' g在这种情况下,八月打印到标准输出。9 n8 |0 _' O$ \; z; @
switch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其
  n2 J5 ^, g! s; @  ^. Q7 i7 f1 `) [" n& _
表达,然后执行的所有语句,遵循匹配的case标号。
9 [0 m) e6 _. H  T2 a你也可以显示每个月的名称与if-then-else语句:; N3 \7 N1 o! M
nt month = 8;
  Q2 u5 X* o4 e5 ]( K% iif (month == 1) {4 l0 T4 }7 f8 |: g
    System.out.println("January");3 o% Q: @8 H+ s. b7 f
} else if (month == 2) {8 t! o) T1 W# h( k5 {
    System.out.println("February");
5 c8 f) L0 }8 z0 H. H}
  m* g# e; C- A+ S...  // 等等
4 i  g2 B7 N& O. V9 p- o. g7 ]% z) G0 f
决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可: }( }/ |( i( V
! v6 W3 L- U+ @2 e! f9 P
以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。) I; t6 T0 K: ?3 A
另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语) [$ P# Z% X$ D8 J" o6 a" z

6 c; A7 [. @( d' R# M; i8 {4 s句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论! h6 r& P0 W6 N) M& m" e+ K1 }
% B+ f' K, w2 Y  B; y% M+ a( \
后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落# M$ Q! I! Z% Y* t4 D7 p  Y

; G+ n6 v0 `2 n空。该程序显示对应的整数月和月,按照年月:
4 k) z" D8 Z4 ~' _, m& spublic class SwitchDemoFallThrough {
0 i$ @7 ^3 }; H" `1 [0 j  c. g8 R8 L% g9 U/ n6 i: A
    public static void main(String[] args) {
+ j$ o; w. P1 G9 z' O# M" K+ [        java.util.ArrayList<String> futureMonths =
: v: v" s4 R, }; M0 P# t            new java.util.ArrayList<String>();
+ V4 X/ ~, u' t) F! i  p2 c& r$ d" [5 O# f; V
        int month = 8;
" @7 N& S$ w1 {4 V) l6 h. ^) `- Z
- K; _0 [6 @3 h  P/ b5 p2 W, f; \        switch (month) {
4 f/ |* I2 E6 Y$ i0 W4 G* Z            case 1:  futureMonths.add("January");
8 @) w+ E+ Y" `            case 2:  futureMonths.add("February");
0 ]+ B) o( b3 E: D1 ^' a+ G) C0 n            case 3:  futureMonths.add("March");* R, J* V6 W( S) G
            case 4:  futureMonths.add("April");
( {4 R8 y: s4 L1 S; G2 Z' X% ^            case 5:  futureMonths.add("May");6 M: t- E4 M. r# m: M
            case 6:  futureMonths.add("June");
7 M8 D+ Q# z/ Z2 Z3 Q9 P            case 7:  futureMonths.add("July");; R2 @& W! S/ t' _
            case 8:  futureMonths.add("August");) K' P  a4 m7 q" q, q& s$ G
            case 9:  futureMonths.add("September");
  K* z9 W3 k/ m, Z7 \9 b            case 10: futureMonths.add("October");
6 S) l, h% m& r            case 11: futureMonths.add("November");
/ R9 @1 V( }4 U7 F( J            case 12: futureMonths.add("December");& I, ]* {, z" x
                     break;4 |0 P& G# f7 a' E
            default: break;
4 x! ~# \3 I0 \& y        }! T( o3 j$ z& v1 D) F

* t7 y  M+ I2 R; k# g( y; S        if (futureMonths.isEmpty()) {
( Q3 |  v+ w: Z. a, K/ c) e, ?            System.out.println("Invalid month number");
7 u9 |8 C4 r1 h. s" b        } else {
, o; G8 {' g! h; ^! [( {. P            for (String monthName : futureMonths) {
3 w2 r' R$ ^) z: Z9 Y! Y               System.out.println(monthName);
+ I. p5 l& H$ h            }
. B4 U) Q7 D0 c- `  o# W3 ^4 A$ K        }
4 u. L' I4 C, N% c4 ~; `$ k' L    }
- C  r7 o& N/ O1 D3 K2 m  p- J% c1 P$ O1 c}
2 ?3 \+ [) f4 Z4 N1 B) C这是从代码的输出:
4 \$ `8 a# H3 K5 e! n8 f  L: p8 D8 l* z6 C* ~( t
August
4 X+ i0 c7 `( R" jSeptember
% ?3 F3 q: l* |4 t% j2 dOctober3 ~; X' P# j5 G8 B) b" @
November2 q/ z0 w/ a8 r3 w" _8 U) u
December) P  D& F) A0 ~$ M' y' O

/ k, r& X- S, I: V3 @* C从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不
+ \; N1 N' j( C# v( K* j0 h
6 J( Z* m! ?" j容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。0 k) t' H( Y8 P
下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数9 q2 u& v- m/ h! I) U; ]3 `

9 s$ M+ R, l4 a7 P4 S:3 j) i. @4 y  m# t0 `7 K
class SwitchDemo2 {3 M1 W3 k/ {! T! G* C! Q" a
    public static void main(String[] args) {
" {% E  l7 }7 `1 \0 }# ?
: `  q: F* B. z8 w/ {& }0 d! {        int month = 2;
* D( e% D8 r9 e        int year = 2000;3 _& V8 S- R$ _$ L+ _
        int numDays = 0;0 W5 s+ _2 p, R( M# |9 h( r

* Z% [, ?- |( z" u        switch (month) {1 D+ {  ~/ E0 v
            case 1: case 3: case 5:
; {" ~+ o1 i+ z% ~$ I            case 7: case 8: case 10:
7 f+ z( l* u+ d3 }            case 12:
; p5 g* B; l8 W                numDays = 31;
5 q, c6 ~! \6 o+ S                break;  J8 t. v+ P3 b  s6 ^' Z$ L7 F
            case 4: case 6:
) J" H, V) d$ e, `: ^- N            case 9: case 11:
- O, m' h9 r3 `3 x: Z                numDays = 30;1 O% _" v/ R: W6 j& Z3 g
                break;' j5 m6 J5 a% S% }
            case 2:  K1 y9 f& x7 U2 a: @9 ^6 Q$ ~
                if (((year % 4 == 0) && 0 F- C. k( V( a6 D% U& H4 U
                     !(year % 100 == 0))5 _* F) w- K4 e2 `% x8 @
                     || (year % 400 == 0))
0 [4 C" L" ^2 P" q                    numDays = 29;
# F) T5 C1 x7 C' ^+ h5 q                else3 A/ P( e3 p: K0 z  N6 \) {. U. |
                    numDays = 28;
7 J! p+ ]8 `7 n0 n/ ~* ?9 X, Q( f, Z                break;5 q5 A) B; T& v9 Y4 l: c2 Q9 ~
            default:
$ a: g/ d  A& q! t/ G; E( m) U9 l                System.out.println("Invalid month.");( {& T3 ^1 @# [$ m
                break;
' y* N+ @, L/ H4 ?) q        }1 L& V9 U$ X' z
        System.out.println("Number of Days = "
/ Y1 {. a& y4 g                           + numDays);2 F7 @* i3 m, X
    }/ E" S& x9 W0 `. _. J. l
}2 c9 q2 Z6 E# @2 \" Q
这是从代码的输出:' ~/ A# }7 m- T& i6 l* A! i
Number of Days = 29
2 L" E) }3 z( ^: ~4 I: f( ^. h
* N3 w% Z+ e, d二、在switch语句中使用字符串2 @( c& B! x0 j/ I, }+ a
在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,
1 E6 _% Q8 j6 ^- ^* q: k
+ F! W3 A; K- Sstringswitchdemo,展示了基于字符串的值为月的月数:0 i& S2 {+ V8 _2 B, T

% N! P/ [, w& b2 T( Npublic class StringSwitchDemo {+ j1 }7 i. q" [6 F& A# O; z
* R  P) `5 n, J) }
    public static int getMonthNumber(String month) {( k2 \3 ^8 H, R' W5 [5 e4 G7 k4 z$ [
* v2 F' a! ]( N% A# V& B& s
        int monthNumber = 0;  Y* L: c  Z  o) K! x

# O, N9 u" L8 T& v6 o9 b( A4 N4 ~        if (month == null) {* \9 z  c! l# n- p5 d1 o  U  ]
            return monthNumber;) T% `2 E" b  C5 `
        }
4 r" W; l: D/ a
% B! y. H* K  r1 J( N        switch (month.toLowerCase()) {7 G1 x  o6 Z3 u3 a: w
            case "january":
. m( F/ b8 C3 c! c5 M7 C2 ~5 W                monthNumber = 1;
7 H# K7 `: S- G: j/ B; _                break;7 d1 P- D- L" {7 G
            case "february":* g9 ?1 ~& W3 f" J3 a4 S8 H- w6 D
                monthNumber = 2;# N7 C: `) x7 [; ^" W
                break;/ u/ J/ L# V$ k1 w4 u
            case "march":
# \& G% `9 j9 ^6 {2 L3 [: C% \                monthNumber = 3;
1 k- A# m" N9 v) y9 d                break;) d* y' W0 x& U
            case "april":' z$ E" N, O8 q' C# C7 \
                monthNumber = 4;3 k% y% {6 D9 u# z
                break;$ W+ K$ G2 J8 p6 Z+ V  j
            case "may":% o; A5 }! T- {: y; N9 G2 z
                monthNumber = 5;
" i8 s+ b1 E1 m- f# N                break;
  o; O3 ^+ D6 |( L# U  e            case "june":# p; s2 O+ }7 Y% s% l* q
                monthNumber = 6;1 j4 a% i& @' L9 N, R
                break;
. V" v  C4 c: T6 T+ R            case "july":4 Y5 n4 r' l  `' x1 `
                monthNumber = 7;
  \2 g0 h6 D& V8 `# Q' J                break;. V+ _% F+ w: ^$ G
            case "august":  k- M1 p: l5 k+ C% R: i
                monthNumber = 8;
/ Y5 Q9 u$ h% m2 d* u                break;
, F% d1 N# Z+ J! J4 ]+ Q& j6 f            case "september":6 h& e( n0 |1 T/ H/ m$ p
                monthNumber = 9;& @1 x9 c" d' V. a) J' h7 j
                break;
" y$ \1 a# k+ Z( f  G9 K( ]0 _            case "october":
/ D3 `5 I% d( a$ V5 r3 u9 I7 Q+ s6 I0 S                monthNumber = 10;6 S* d- X4 S/ H# v8 b8 C3 d  y
                break;# v% ~; s, u, m; b: S& N
            case "november":& X& S" {1 x/ p1 ?9 [
                monthNumber = 11;' R2 _/ H9 \% r% {2 C2 U& ?- V/ l* w
                break;* d2 _" f$ q4 ?0 ~5 W
            case "december":  J  d% V) E$ _9 e1 F* X. z
                monthNumber = 12;
3 M% y$ t& _. K                break;0 J% l. l3 A0 T- H# _4 j* w
            default: " |  p+ A  u) t' L9 z
                monthNumber = 0;* g  r6 v0 e0 i& C$ P
                break;
1 k  Q8 H6 I$ D% a2 D% O7 Y5 U6 k5 u        }& S5 W/ [. G/ ^2 m/ X

; v+ ]. H1 i5 R* R' C+ @+ q        return monthNumber;/ y# ^. s4 v) N6 M( }3 ]; A
    }, O  V" l: v* F3 j
7 s2 \0 H8 r- n' {
    public static void main(String[] args) {# n* z3 D1 M# A9 L9 c3 _; A9 i
1 h) B- ^, I7 d) S- K/ x2 u& I: u* X
        String month = "August";
; V, o3 e8 I; [; A) W: _7 [1 a5 j5 B8 [* L
        int returnedMonthNumber =
' s# C9 J7 W- r" c6 F& ~* G% O            StringSwitchDemo.getMonthNumber(month);
- [; p7 p8 N$ a/ Q7 ?1 d7 [- f9 W& \
0 t* M4 k. ?7 f        if (returnedMonthNumber == 0) {3 Y/ H& G( o% A
            System.out.println("Invalid month");
2 o( Z4 M" X+ ~/ x. ]: Q  d7 ^        } else {1 J  E0 c7 E$ i0 e3 o( N- q
            System.out.println(returnedMonthNumber);
: g6 s, m1 D  {$ K        }3 {% X4 u* V% p* a% V9 o, a; R  M
    }
8 }& [1 B7 F% d0 f/ ]}
, B/ `% g4 k' L0 O, Z" M" s2 H  h$ L从这个代码的输出是 8.0 H/ C0 M& O: E" f
switch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了" ~! {7 y1 f! f) X
0 N2 {4 N1 F4 C. b2 `, Y
stringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符: h2 t8 I7 k1 ]4 a
, Q: V. y8 I) ?+ N! T
串小写标签。2 B# o. \' R, ?4 y# p8 d
注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个
% W/ m; X- z( g# N5 Y  P9 V6 p4 q" ?6 n4 D( o
NullPointerException异常被抛出。
- {4 v5 M' b7 ?  X" g本文转载于toceansoft.com
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2026-11-9 14:57

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表