工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 542|回复: 0

一、switch语句的使用

[复制链接]
发表于 2015-5-5 11:23 | 显示全部楼层 |阅读模式
一、switch语句的使用
9 K% V- E, V6 K' d! e- m/ G而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和
  B" e4 m6 _% z/ b3 r3 r0 e4 U' E( c# G# m: q2 o$ b
原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始; H  i! x, {2 N- j0 G+ |

7 B/ g1 f: L* E' _6 @, O类型:字符,字节,短,和整数(在数字和字符串的讨论)。. ^  m  _6 ^+ K  R3 m
下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值
# o% L, r4 @5 H: S1 ?
; |' U: b) }  w' W  N/ R,使用switch语句。
! p% P- f( V' W' @. Zpublic class SwitchDemo {% I- a) e- [/ G
    public static void main(String[] args) {% s% c* C* E( L
- t- G* h( i5 r5 y! L6 J6 T
        int month = 8;
3 e. M" o5 q2 `        String monthString;
' h; L& Q3 M7 r- ^        switch (month) {
% _. V# t  @5 s* A" q( Y            case 1:  monthString = "January";
) _( p' {% i3 P, m0 C" B/ G" l$ Y7 R                     break;
2 K( G2 m- Y* `+ e# c, t" ]            case 2:  monthString = "February";; R5 I* C; E! m( e* X6 E9 Y- e
                     break;: P0 q8 }0 a/ G* U5 K3 K
            case 3:  monthString = "March";
6 R: E/ S# ~% {' c+ Z8 G7 E                     break;( U' A$ X$ l% Q
            case 4:  monthString = "April";
$ ?. Y- e) v1 R# }0 _6 b% g: `                     break;) a. i: J7 i$ g1 Z4 }2 O7 U
            case 5:  monthString = "May";
: s. h1 J/ \( J0 P9 n. l                     break;" F; g4 K% X$ W
            case 6:  monthString = "June";$ \. I$ s+ v4 U4 p8 Z! E
                     break;
/ O5 _" Z" ^) \% F3 ?            case 7:  monthString = "July";
, S# l% P1 V1 Y" v2 J                     break;
9 g  Z- M; h, J: @. v$ q/ W            case 8:  monthString = "August";& d% A8 {3 U; U: l: T6 X7 u3 W- L
                     break;
7 O) [, u7 G- p            case 9:  monthString = "September";
& H' Q6 l4 ]  b1 O' b/ e2 d6 }. Z                     break;" J9 _9 A; i7 F, B8 a8 A$ z
            case 10: monthString = "October";
7 h) \7 p. W3 p( C0 H8 u1 H                     break;
; D# ~; Q! X5 v" R            case 11: monthString = "November";7 G: p& Y7 W% n3 W! j7 @) M8 V
                     break;1 p9 d7 _6 ^4 d, r4 C- g
            case 12: monthString = "December";/ r7 X6 i) x3 Z7 i: F
                     break;. n4 F" I9 {7 W3 ^% O1 z
            default: monthString = "Invalid month";% p& m9 L( C/ p# N9 x  W
                     break;. q' n+ L3 |' y4 z$ w) w& y
        }4 A9 _  ^1 e+ S" Y! I+ F1 c& e; n
        System.out.println(monthString);
! i% v$ \! [3 k" k6 f) _4 D    }7 m! H+ |& k% z6 M) T, O
}8 Y: }$ M( S1 A! P$ Z, T/ [3 P. A' w! A
在这种情况下,八月打印到标准输出。# Z0 J+ G7 d" g0 D8 x& Z' K& r
switch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其
3 v% X. V! F, R2 f
; @) k3 f! T. J; i5 D表达,然后执行的所有语句,遵循匹配的case标号。
% U& V9 e9 S% s+ r' V你也可以显示每个月的名称与if-then-else语句:) x6 I5 w1 @  Z9 i: }
nt month = 8;3 E) N6 H6 A& i# w
if (month == 1) {5 t: A, G8 x6 {. @6 |3 |
    System.out.println("January");
$ o- ?4 e5 a! w, ^) L& T} else if (month == 2) {
9 k9 ?) j  o% B! d3 h    System.out.println("February");# h( s8 \" Y; J/ J" c- B6 {
}
" a+ I" A" j& b+ m" f4 B...  // 等等$ }5 a9 n& w) L; ]) o. m/ d5 F

1 V/ `$ Z1 u2 V- y0 t4 C7 ]' C$ C决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可2 T# r" D# I3 m! w# x
3 O1 L+ x% f1 i* G
以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。8 ^/ b& |  D& d7 W% z; r1 Z+ @
另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语7 y+ I! E* s/ ?
2 X9 l7 w2 w3 R8 P8 \+ l6 J
句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论3 }$ o" H+ b+ z2 T6 I

# [. C2 Z0 ^$ W. R' I: s1 G后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落; q" H" m' o7 W6 d
+ x( F7 S: J8 X# W
空。该程序显示对应的整数月和月,按照年月:
  c9 {, g4 T; f/ m7 G9 apublic class SwitchDemoFallThrough {
( s! Z* H, [3 i8 D6 T8 T) D' x% ~. z( C0 t: g( ]) s& r( S6 l
    public static void main(String[] args) {' D; H5 C! N5 Y
        java.util.ArrayList<String> futureMonths =
0 Y2 T5 z" h+ R+ m$ s/ t3 F            new java.util.ArrayList<String>();
! I2 X8 \0 @* }9 N
, S4 u. j  @( j        int month = 8;' `8 |- [* G, {: V& q
/ m$ g6 H+ C# W1 m+ i9 I: Z; }! X
        switch (month) {3 a- Z$ I/ U( F! W6 h+ z  _
            case 1:  futureMonths.add("January");
  e3 i$ Y6 b7 J, r            case 2:  futureMonths.add("February");3 a) W2 _. h' H1 w& s9 |/ S$ z
            case 3:  futureMonths.add("March");
0 V9 T6 H2 X3 o5 E% L5 I( W            case 4:  futureMonths.add("April");
* J( K3 p7 G: ^4 ]            case 5:  futureMonths.add("May");
+ W: T  W* T5 Q            case 6:  futureMonths.add("June");
/ g1 u- m* {& m            case 7:  futureMonths.add("July");3 b% M4 \3 O* Y/ E8 M, T0 A- S0 P- |
            case 8:  futureMonths.add("August");. e$ l! y6 X# c* ?5 Q9 Z3 I
            case 9:  futureMonths.add("September");
5 y( n7 X. n0 h; L0 d            case 10: futureMonths.add("October");
; Y2 f3 \+ d1 V& h' V* h            case 11: futureMonths.add("November");
! A0 R/ `# o" W4 S& V  U( ]6 Q2 i            case 12: futureMonths.add("December");
& ^1 p7 b  p7 X1 O/ u5 S+ M                     break;; k9 y+ j1 I. a7 F" T* x
            default: break;$ j! W. Q* F4 ^+ R" d! O
        }
  q+ g: u6 _3 H: V' k2 Z- r
; w+ M" _' w, h& R        if (futureMonths.isEmpty()) {/ B; Z8 l6 Y2 h) n: i6 U2 u! |
            System.out.println("Invalid month number");) S" H' J: L: j: X& q
        } else {3 [) s' \5 H; S2 l9 d( `
            for (String monthName : futureMonths) {
; ?3 `& t/ t2 e: j; ^. L: P               System.out.println(monthName);( c! C. j) T# B* q/ ?+ v
            }, d/ p; L7 Q1 z* U3 H
        }
9 p0 W' H# J$ ~- W7 m    }) n: o% Q5 Z+ x, o
}( v+ }, U9 o  Q
这是从代码的输出:
4 {7 ]+ ^$ o4 r: u3 l! e- l3 }' j, J" o& ?) e; }9 K  ]) J& J
August. F8 ^6 I: c' n2 G- Z9 X, ?& j
September
3 R  t$ X% r* N7 H* a! TOctober7 F1 W! o, U+ x& N- `6 g
November
* w- f! Q3 Z4 S: x' tDecember
5 @2 O+ f. r7 M: E  A  Q$ h7 g' ~/ D, K( M! |  X
从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不
' O+ m" ]4 u* e7 T9 A3 R# c- p4 R2 O( z0 z1 [
容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。2 G0 g# y. U9 f; y: r/ G
下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数& C  [. [2 Z& [2 B

3 G& ~+ X7 u+ x2 [" B. c
" |* ]# a  T6 ^class SwitchDemo2 {
! z' F  Y4 a! f& o8 q* c    public static void main(String[] args) {3 r4 u. g6 O" s6 v4 `( Y3 a# U

# c. e% j# U- V        int month = 2;5 Y: S8 J; t3 i5 U2 E) U% w; T5 g
        int year = 2000;
* V8 n, J3 k5 z        int numDays = 0;
3 l+ @5 v; v  X$ Y
, K. m% l4 s5 |5 x, p7 J) n! P        switch (month) {
& ?. ]+ G  L5 Y% h: A            case 1: case 3: case 5:5 Z) Y% r% G4 `2 n% r1 A# J
            case 7: case 8: case 10:8 h: ?9 ~/ a; u: e1 `
            case 12:
* c( P& E) @4 \$ Q                numDays = 31;
1 ]* T& l3 B2 y- k$ F                break;
% D* f( a( d$ u7 L" Z            case 4: case 6:: X7 z' c! B4 @: J6 V! m
            case 9: case 11:! n$ A6 a- ?6 }; a. y; f: s
                numDays = 30;8 Y- P6 F8 P; Z% H1 ?& w
                break;6 C3 E4 F' M8 @2 G* B5 @
            case 2:1 O, }% V/ J/ K( ]  m+ {
                if (((year % 4 == 0) &&
* Q, a, p* p, u' U                     !(year % 100 == 0))
; S! t( x5 {3 B6 L5 x# @( A                     || (year % 400 == 0))0 Y1 f9 L9 j; _8 x0 m" m4 Z5 i& _  @* L! I
                    numDays = 29;) n& H+ L- V( B% @6 T
                else0 k! T7 a: F" N; ~, L3 f4 |4 W
                    numDays = 28;
9 C, ]* l  k0 N0 t                break;8 l& q8 X+ g" w3 E' H9 P1 t
            default:
  b0 U3 z6 l2 h                System.out.println("Invalid month.");
! i* c3 `2 L4 [' @: t; P# U                break;3 I0 J; Q5 c& g' \7 m9 H( f
        }6 _. g1 W1 }5 W" Y6 h: ?' f
        System.out.println("Number of Days = "
4 o9 I0 W2 a' F+ e" N- N                           + numDays);
; F- S  l7 _8 B6 \5 |7 {    }8 z( Z6 Q7 Y) h/ L+ K# y
}4 g: N& Z/ |" [) O9 |
这是从代码的输出:
( [- S, l" a$ r8 q% MNumber of Days = 29& h7 G  m' l) @0 C4 Q

  z3 f% Y  V/ I7 C$ C二、在switch语句中使用字符串
9 T2 q4 b; o: N7 \% |. Z在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,
/ k5 o. v/ S! [& |  ~; w1 ]* a) T! ^( H6 U: r
stringswitchdemo,展示了基于字符串的值为月的月数:
' {4 _4 q9 l" B8 D6 j5 F4 q) ^; |. ~7 Z$ \3 v
public class StringSwitchDemo {
" N: _! B2 b. {8 V9 Y
/ h. w' u2 Q. }    public static int getMonthNumber(String month) {# u! _6 S; b( P: q9 t" T
( D6 U) s8 W* u, e
        int monthNumber = 0;: D( v: u' e5 P5 H( C5 ?

& G% y7 Q8 ?% v% Q. s        if (month == null) {, [- c! ^* f' r. c
            return monthNumber;% ?9 J6 G' `0 `7 z8 i3 t1 T$ f6 g
        }
- u2 v  }: F1 G, U; K
2 i, a- r$ [- A/ o/ q7 ^        switch (month.toLowerCase()) {8 x+ L- T4 n- _( d# T9 H: O# H
            case "january":
2 U6 p3 Q; y" ~6 C4 v% q                monthNumber = 1;
7 Y; b2 E, }5 b( j, N' K/ L; g                break;
8 f5 a2 ^' ?) O, J" Q; v0 y            case "february":) M. _( \  W' o1 V- m5 B6 i
                monthNumber = 2;" {: \' C; J9 M) G
                break;
3 K$ J3 S/ f4 L  ^# I; F5 p3 t$ o            case "march":* }9 v  a% h7 \3 }
                monthNumber = 3;
) Q6 L2 Y, R5 X7 l/ U) F$ J) o                break;2 A# |; y$ H' t+ s* U# C
            case "april":& t) g3 b* `+ B. h
                monthNumber = 4;
/ ^: O* n$ @+ I                break;
- j& ^. Z( T& U. R            case "may":
, ]1 q6 E) t/ [9 z8 X                monthNumber = 5;
9 w2 s) G2 F5 o                break;  e1 G) I3 O) g& I7 P8 p/ \4 q
            case "june":; S! A. S6 ?/ v/ V! G8 t
                monthNumber = 6;
- K4 I# |& Z$ ]+ y; `4 |                break;4 i, y- R4 H" X; ]# I; C/ f
            case "july":
( T, W: X# {( m                monthNumber = 7;
: J/ K' w, ]; P                break;# O$ @3 o1 _* T6 O1 g& r& C& I4 R
            case "august":5 ~5 V+ ^) Y% u- A2 h
                monthNumber = 8;
. X- ^$ M: {" b" Z5 I6 U) b; P                break;' c% o. c  ~/ x- N% k
            case "september":: c% o( a9 |/ V. m+ s$ G2 J) B1 {
                monthNumber = 9;5 h! ]8 y9 N6 L0 B* S
                break;
" t" w3 m) W+ a- w/ G3 e9 [4 ~            case "october":
* m3 k9 S$ Y) V                monthNumber = 10;
: b! Z6 J8 e) Y5 |( Z" u# K                break;7 R( ~) ~' n6 g' E; I; X0 V9 T/ s, Q
            case "november":
- ?/ s# `: {5 a0 U  x: l+ S                monthNumber = 11;4 q) f2 k$ Y' m5 z
                break;
9 S8 n* T( E* r1 }            case "december":
0 N3 x) i* h' E; \9 d4 T% Y, U                monthNumber = 12;
! [( I% o8 `6 `) \8 m                break;( D: q! x* D  N1 [- m3 F: y- v7 e
            default: 4 c, ^! ~7 B  \
                monthNumber = 0;
1 A! M+ M/ u) ^                break;/ K- r% ?0 m, X" O! Q: w
        }6 H3 n5 R; [$ V9 S: Y
& {" a) n' |, `) i* F% D
        return monthNumber;
& j4 L5 l- K0 M/ N0 ^) R$ F0 E    }
, l* \2 o' r! z; B# j" U
# v  g9 B4 _/ `0 d    public static void main(String[] args) {' E2 Z+ w0 W! P5 y: V  }5 Y5 J) |' L

5 u. L  y7 M9 ^' b$ q5 [0 x5 u        String month = "August";9 x, E& x% Z& ~4 q. I" x& Z

) U% Z! {. \* b0 Y        int returnedMonthNumber =
& C* A% z9 @6 X" w( [            StringSwitchDemo.getMonthNumber(month);# P5 F: f. x- _' g- X3 G, i
2 q/ J0 m. A: G1 d, W8 }
        if (returnedMonthNumber == 0) {
2 V4 k& j% ?& i# r, {1 O. S            System.out.println("Invalid month");
& d0 K) R) }0 L# j, c( E        } else {/ X. v/ ~" @5 c, z8 a$ O- ?
            System.out.println(returnedMonthNumber);
9 t  R$ m+ M, ?        }
' I7 j" x4 j! h+ c; s' r* H2 ~    }* \( }! x! e( _! U; c
}
3 C3 A  X' I3 `0 g从这个代码的输出是 8.( B- Q0 R# I' Q8 B5 k
switch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了& w' L% D% P$ Q5 T2 k8 G" [
# _8 K& C8 d0 G/ l5 {3 p! n' `* z
stringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符0 R) `' W, o' I! E) S
7 ~# _. ^8 W& R/ E! j( S1 H
串小写标签。
4 m; A% G3 x, g/ g! P+ {& D/ {$ L注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个
6 T; B$ f- w% m; }% i) ?4 C
- V: z% r9 Q5 @9 N* v" lNullPointerException异常被抛出。
2 m; e- G& ~# k9 d- s/ ]  l) D本文转载于toceansoft.com
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

GMT+8, 2025-9-26 10:16

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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