工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 543|回复: 0

一、switch语句的使用

[复制链接]
发表于 2015-5-5 11:23 | 显示全部楼层 |阅读模式
一、switch语句的使用7 n. ~, o( B7 o3 O3 e2 j' S, Y$ {
而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和
, E" v' p5 [. r9 G1 f8 @: U* u) s0 ~& |
原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始5 o& Z* k( {( j8 n3 u* X
6 `' l) A( v& \7 D
类型:字符,字节,短,和整数(在数字和字符串的讨论)。2 Q. n) E. C8 C. g
下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值
" P8 W7 k7 h& w1 K. _
* V" K* O. Z! `' [! f,使用switch语句。( N' @7 e. X* M( ^
public class SwitchDemo {: N. V3 P: ~1 r/ |
    public static void main(String[] args) {
# J9 {4 W, l  l0 H6 `  n$ d2 n+ M$ \8 g6 U9 F  w) b
        int month = 8;8 W7 t0 u* z7 i+ u- j$ X% S6 F
        String monthString;
- S  G3 M& m; `4 {% _9 g        switch (month) {
1 |/ U4 J: d: y% T8 x+ g% u            case 1:  monthString = "January";3 i  v; x8 r& i% l% ^1 j/ s8 Q
                     break;$ i1 u5 e% y- b0 @
            case 2:  monthString = "February";4 b9 f; r) G, C! g
                     break;; F6 @. ^4 }0 Z
            case 3:  monthString = "March";
  O' T) d1 i# X3 b; D, v1 A; w                     break;( W+ S5 P4 j2 p# k" M
            case 4:  monthString = "April";, d# {  Z/ {* _- \
                     break;
! v! L. g, |% O. b+ ]; U* x1 W; V- t            case 5:  monthString = "May";  u. K9 `4 h( ?0 n
                     break;
: ~; [  b- u$ l7 b6 {4 t            case 6:  monthString = "June";
+ r! e6 @3 ?6 v/ D5 ~% k" [                     break;
" T+ e) s( }4 O& h$ H" G' O4 l            case 7:  monthString = "July";
9 N4 n/ n# M) H! z' v( c! \! u* i                     break;  Q& ^" A- e1 `# @& ]. M
            case 8:  monthString = "August";
! k& N! `: m/ ~  k* C1 ?                     break;
1 H) m; F# q/ r8 j            case 9:  monthString = "September";
5 W/ d# u) C6 |. S! W) j5 y* I  T                     break;) X1 k/ g$ Y# f$ n- L
            case 10: monthString = "October";
5 S. v2 X7 v' w" U                     break;
  k( o: B7 r4 X) b) M            case 11: monthString = "November";/ t; {* K. S1 p; m8 Q& g
                     break;
8 Z  M! H8 P) _3 X! s# v4 n            case 12: monthString = "December";  ^' V  e; `' s2 W9 o" x- D
                     break;
5 C9 l8 y5 {2 c! a5 e. @& @            default: monthString = "Invalid month";
, s; I- |0 b; b/ E                     break;6 v5 {* J  C$ t/ ^4 B2 ?% Q7 q, s
        }) U4 |2 v! W# @5 k* N- [. |
        System.out.println(monthString);
0 Q- N1 ^* M* S# L9 G1 _6 }    }
8 X8 i/ }+ i/ N" s* J+ [" B& o# x}  K  j7 X1 p8 R% `0 h
在这种情况下,八月打印到标准输出。' x# V3 y/ x3 S6 l0 F0 F! O
switch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其
# j% w& I9 c4 ~  U: w
, I3 h$ z7 j& B表达,然后执行的所有语句,遵循匹配的case标号。% }5 n7 x0 D0 ?/ o& V
你也可以显示每个月的名称与if-then-else语句:
2 m7 r( Z. ~, \4 e$ tnt month = 8;
! ~4 t' t$ _( k2 J, [if (month == 1) {
. [' V' V+ K8 B' T    System.out.println("January");/ {- p6 r# X7 }5 A: S6 V' d
} else if (month == 2) {
& ^* |# v- Y, ~6 C    System.out.println("February");( v& L3 L$ |4 X1 j8 l
}
# l' W* G( l& V% j& i6 t7 W...  // 等等$ t. X7 |; B. @
- n$ p/ b& K; i6 L4 Y  z( G) H
决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可
9 l% ~, b6 o5 [- X" O+ [6 q8 H/ ]& z' @
以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。$ O9 `/ E1 X! I- I2 ~' M6 m) \
另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语
* H$ M- g% E$ {$ x$ q
. q) |# D" N' P3 Z0 G句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论# q4 ?0 f+ W& i
2 e8 M9 w7 |5 t& w4 Q3 R
后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落
  o; B; ~. |6 I& S6 F3 L
/ I. q$ w" w8 N5 c% ^空。该程序显示对应的整数月和月,按照年月:
! T' W2 j( Q$ T6 A4 ~public class SwitchDemoFallThrough {
' c: M) S  j9 C9 m6 R- Q0 J8 z; _# f
    public static void main(String[] args) {* \0 t" D! n. Q" a/ g2 G# S1 F. E* |
        java.util.ArrayList<String> futureMonths =: \# ^' }- _& W' z" h+ Q5 q1 H
            new java.util.ArrayList<String>();
. d" I6 e" y- U9 n/ ?0 l5 W$ N7 {5 c4 z! x% [) x
        int month = 8;
( K; P& x( d" ~5 q9 _& b2 c+ k; H
8 ?9 n3 ?5 c: o( o1 P% @, N# k# i& R        switch (month) {+ t! }% p% m: {0 Y4 t7 q5 @( c
            case 1:  futureMonths.add("January");
' |$ g. Y$ {8 _# ^( R            case 2:  futureMonths.add("February");
) x4 g  ~$ R5 y, s9 O% x: a; h            case 3:  futureMonths.add("March");
0 w" h# k+ r" n+ A% i) f& b( i            case 4:  futureMonths.add("April");" q3 R) Z6 G  G* T
            case 5:  futureMonths.add("May");# b$ {) j" p! B
            case 6:  futureMonths.add("June");
; Z1 U0 b5 E7 }$ I; ^+ e1 z/ v            case 7:  futureMonths.add("July");
. y& E1 ^4 B! E            case 8:  futureMonths.add("August");
/ t: G1 j* F3 e5 T; K, \            case 9:  futureMonths.add("September");
. K3 W- s& q2 Z$ ^  \5 }            case 10: futureMonths.add("October");
- {$ G3 a+ x. W1 `& R# R            case 11: futureMonths.add("November");
) m4 k7 q& m$ b4 B; n: Z            case 12: futureMonths.add("December");
  s& X2 {& U3 t5 |7 H4 C2 f                     break;8 A- G; _4 v' q* {% R! E
            default: break;" {- }: D8 T9 Z" Q# j% N
        }1 c) T0 E3 |! B7 H; o
7 \5 P4 F5 N7 i7 K' j  l
        if (futureMonths.isEmpty()) {/ s3 f$ d$ z9 a' A$ n* q$ ?/ c. O
            System.out.println("Invalid month number");+ L, A7 M; T& C) [. s
        } else {5 [2 a& u3 W9 k" j) N( l
            for (String monthName : futureMonths) {
6 y% I2 J3 R3 x7 D; w               System.out.println(monthName);
6 J- J# h; {; W. b# |' |2 k            }4 p- o9 F9 F. J$ p. |
        }& ^0 b7 }5 Q' B. L; J( l8 J! l
    }3 r$ w1 N* O. u; h5 Z2 C" m
}
8 Q' m. k$ O$ B' U9 ~% s# V& F/ f这是从代码的输出:+ E4 o8 l/ u! N3 F
2 n' g2 S$ k5 ?
August  d1 H: f0 R2 w: O: O
September0 A! q) s) G3 v" Z; G
October1 I1 h( x; E7 j9 a7 B
November* M" e% k6 V/ ?
December. x8 M5 D+ w4 a0 K0 v/ ~# [/ T9 W8 J

9 R: D9 Y. g/ \+ g8 b从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不
& E0 i4 ^( A! S. S1 W8 v: y+ v& O& v8 A5 }* q+ g: ]/ _
容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。
1 g8 v1 U: L7 e/ A" j0 u4 i  f下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数9 \/ f1 |+ t1 C' w

- k' Q7 L" A) e9 _$ z- o9 g* ?* N$ t- M
( u3 X6 u, u4 a, v  o  A7 S. hclass SwitchDemo2 {; B* I& H4 I; C. m# v) u3 R- D/ w2 |
    public static void main(String[] args) {
- T0 a1 _8 H$ Z1 E0 {9 s: Y# h& J; d. ]4 R0 o
        int month = 2;
6 n6 f% A4 g" k: O2 T7 g        int year = 2000;
. k/ G$ ]2 _- h: J3 Z        int numDays = 0;/ {  o& B) c, \- o  C0 R% x
& A7 s) ?# G$ [* F1 N
        switch (month) {  {1 |- e- [1 }- c' ?
            case 1: case 3: case 5:
' H1 O: ~* ^9 J" p1 V1 M6 ~; P% n' Y            case 7: case 8: case 10:" f. G" G. z/ ?4 V
            case 12:/ Y' X; j: G- k( H5 \
                numDays = 31;
# B2 F" F+ O; L' o8 b                break;
2 ]9 O& s: F- R            case 4: case 6:9 Q# g' [& r8 K
            case 9: case 11:" G6 u9 T4 U& u4 Y+ @4 K8 v
                numDays = 30;
) I/ S! T( Z+ |                break;
& n9 X$ D( ^$ c6 D! f            case 2:
  G0 l2 I; S: |. ]                if (((year % 4 == 0) && , D" C% K! P5 o
                     !(year % 100 == 0))
/ h9 B4 Q+ Y$ a                     || (year % 400 == 0))
4 @! z- I' v; Z! Y7 H                    numDays = 29;
6 o& y% D+ X( I# D' V3 Z: h                else6 Q0 d% M( ^, ]5 ]& t
                    numDays = 28;
0 S8 x1 j# X$ u* F9 L6 }; {                break;
3 v/ A' w$ r; _6 b! C$ q* s            default:) ?( ^" u+ g1 o- w6 I
                System.out.println("Invalid month.");; M. U* L1 r- j
                break;  _3 [4 Z7 W- j% |1 q5 F1 e7 S
        }4 u) z. h9 D  _6 l  L% r
        System.out.println("Number of Days = "
5 \! J& I6 f# ?2 Y                           + numDays);
0 U# Q/ W, v  C0 {    }
# m- k9 x* h# a( U; l}
0 [/ j# R, k3 k5 l8 ]; E这是从代码的输出:& W8 @3 I% w0 f8 H8 \1 l# \
Number of Days = 29* D4 K' k. K/ K3 d: M: V: z
- T$ r. G! Y& z
二、在switch语句中使用字符串4 i+ T$ r! d1 N/ j) p& G
在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,& I" q* ]1 t3 Y$ n
4 f. N/ J' w0 X# s9 }+ w! U. U
stringswitchdemo,展示了基于字符串的值为月的月数:
) e- z( z& W, b) E2 S" S$ }" _0 K3 \% f  q: ~+ l
public class StringSwitchDemo {
9 ~* C( j; _2 X
! ]) `! u# F5 o' }9 p. w% L    public static int getMonthNumber(String month) {
- S5 G5 d3 U- a- Q
9 [( T: ?% w% [# O. b: f7 }        int monthNumber = 0;& q5 L9 ]2 s0 m, t. _
% t. j% |1 x0 x& q. ~! f
        if (month == null) {. y* b4 b+ {. `9 k: g
            return monthNumber;
/ s% z: B/ a2 t1 a3 G8 H+ N5 d: u* W        }
: h1 h' {; E" I3 w5 k8 J) j' B1 a5 q' D7 {% Y" O/ i
        switch (month.toLowerCase()) {
# G0 u% ]5 U4 i4 d  F# q            case "january":5 }6 I7 a, l. d) a; Y. h) L. T- M
                monthNumber = 1;+ ?9 a8 ^" `9 Y! n6 a" }
                break;2 E3 s4 C1 \# y; S
            case "february":
5 {  F2 o: d" R" m" s                monthNumber = 2;  F4 b* ^$ s$ m9 Z) X) A& f
                break;0 A& B+ S' p3 w, s1 ~8 O) _
            case "march":
. Z8 o& j, `6 y: e                monthNumber = 3;
! L, L: r! [$ R3 L: D3 {" X                break;; I/ B) ~! Z1 ]+ O, `% K+ j/ L, R
            case "april":
; R9 W, W3 a( Y( D; `                monthNumber = 4;* ^3 j9 y7 ?  w5 e
                break;' b6 t! R$ L$ t
            case "may":
! w. n6 L6 @4 j* h  ~  ~                monthNumber = 5;7 ?5 V- Y: J8 r0 ^, K8 z
                break;) p. V/ [. n* ]3 }
            case "june":
# s" n$ Y1 r, g5 y0 [                monthNumber = 6;' `: S+ M  }+ q
                break;
* C4 A! f  w! ^7 V% i7 O# y: Q            case "july":0 A( d/ \1 _, F
                monthNumber = 7;# q- `: i7 q  d4 c
                break;4 k1 e" A% S, s, A7 M' A
            case "august":9 Q( Q4 {+ Y5 u/ [
                monthNumber = 8;1 \& u" h' N2 |" ]" P' c2 F
                break;
" w9 s6 a/ ~. I# V            case "september":- P9 \3 V: Z1 X: S# d& h8 H
                monthNumber = 9;
' l& r% e5 v! Z  b5 r# i                break;2 n6 N5 N0 }# k4 U% F
            case "october":  A' x/ U6 Z# W5 N6 X, y6 C
                monthNumber = 10;$ F( B+ K6 c8 J! j* |, `: n6 [1 K
                break;
; f# |0 v% R1 D  E6 K6 H            case "november":! U( P/ o7 M3 X9 v7 R; J
                monthNumber = 11;
$ f! U; i/ l( k3 S/ s                break;
; k8 T6 |: ?2 f            case "december":
3 m' f2 u0 W% ]! B- W9 v. B                monthNumber = 12;4 Q1 b  g( e/ U3 A5 k( g' _: u
                break;) C8 r2 [' v) a6 `& [
            default: 0 n; k2 @0 Q0 Y& \* L0 V: U7 ?6 \
                monthNumber = 0;, }9 ]  k$ G2 A- j
                break;
6 w# e# r+ J3 e( D/ p. T        }
8 t" Q: a$ k. ^3 p; A9 G
7 I& @4 m- L$ R) f, |        return monthNumber;% u+ s/ @+ e$ Z6 x
    }
# T" B& F+ m6 e5 f  K& l
  h$ D& x5 a; b/ b. D! z    public static void main(String[] args) {4 D8 o6 ~2 c2 u: V; g' t# Q

( ?$ d4 |% |4 O5 f  e. P3 x        String month = "August";
0 J/ E: N7 z' }$ O' h6 r) N- b
. J+ w( Z. I* l        int returnedMonthNumber =
2 C7 Y% A3 v9 c            StringSwitchDemo.getMonthNumber(month);. C# w- k4 n9 K3 M2 S, I
7 c; }' S7 A) g6 a0 M. J  i/ m4 E
        if (returnedMonthNumber == 0) {
% b- {0 D# u0 _  M- c6 q            System.out.println("Invalid month");
. M  f1 }& L8 r2 [! }, r        } else {
+ m' G% o4 t  J            System.out.println(returnedMonthNumber);
; F2 `* [# u- g; k        }! M9 r; i" w/ K0 N
    }
0 A0 `: r  ]7 A}1 a5 M2 z0 ?& g. D
从这个代码的输出是 8.
! I% r- T- J$ q  @+ W% Jswitch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了
) z# }& i$ d6 G8 }, m+ f
" |. f9 X# p; Y' d. hstringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符! `- @& u* J( [! n1 ~

1 c( q! i* G; @% i5 j+ Y9 L- O串小写标签。+ W3 O# J0 j' K) b8 J
注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个  g3 c" h4 v3 X
) k5 }  A5 @. ^, M0 J
NullPointerException异常被抛出。
2 N' x$ T1 ~: H, Y4 o/ u本文转载于toceansoft.com
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

GMT+8, 2025-9-26 11:36

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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