工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 481|回复: 0

一、switch语句的使用

[复制链接]
发表于 2015-5-5 11:23 | 显示全部楼层 |阅读模式
一、switch语句的使用
& L; b2 l) }0 q而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和
7 K: Q/ o2 q4 W( ~+ |5 E7 O' ~! I! [& ]1 P# O/ _1 ]8 F
原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始% v# D0 D( m$ B5 f) T" P
" `& q7 f9 ]' P
类型:字符,字节,短,和整数(在数字和字符串的讨论)。( S  _' c& V& L4 b
下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值4 P& c$ n/ u2 ]( r2 k
6 r$ Q* [# W9 w
,使用switch语句。5 U+ d  ?+ ^4 F" w
public class SwitchDemo {, |5 |& z8 R7 ~3 _; V" q
    public static void main(String[] args) {5 h6 x$ e8 P" x' S' {# Q% Q5 M6 w

/ V4 D( d  l# K3 Z        int month = 8;1 \0 q$ A: b  p! F0 E
        String monthString;+ o& G( {: t% J; Q# U$ v7 }4 X
        switch (month) {0 c$ b% `; b( v% p6 \, l
            case 1:  monthString = "January";% t& D9 W5 i: F4 K  t
                     break;/ A' y9 }& F: h" H7 p2 |
            case 2:  monthString = "February";. B3 w! I6 V  e6 c, I/ @+ r! b4 k+ D
                     break;
1 Q& [- l9 Q1 o; [            case 3:  monthString = "March";) G  W5 {1 i. S7 M
                     break;
% E* s1 _9 B7 k2 U. n1 {6 e3 F            case 4:  monthString = "April";
8 n6 n. S/ N+ W  ]& k- G4 P/ v& y7 [                     break;
' a8 \$ O& D! G: ]% N% Q: J' g% |1 o            case 5:  monthString = "May";
4 ^- q& S& }" y  y2 N. V. ~                     break;
# i& J- M2 \0 P/ b4 f0 A6 A            case 6:  monthString = "June";+ Q5 r2 n1 T0 X1 r6 s/ d/ T
                     break;
7 w, E7 E7 u* [9 g: t* G' [            case 7:  monthString = "July";
0 V& R" `- U: ]/ j! s0 H                     break;& Q) v. d9 Y5 y% v3 L4 L
            case 8:  monthString = "August";
* y5 e5 ]% X0 [$ O, [                     break;: W* w. T) }( T' {/ X" [$ O
            case 9:  monthString = "September";
$ I4 h. o6 N( N% S- y                     break;
) R7 d2 A  P4 R8 Q) R- Y8 X            case 10: monthString = "October";
  ]7 m3 N. t; x6 m                     break;
- d, }. j/ ]+ B7 H" k: D            case 11: monthString = "November";
' ^, _' G0 u: g1 E                     break;! z! o! l& z  W
            case 12: monthString = "December";
9 H" A, _5 p0 f1 G# C5 J7 c                     break;5 i' |' u6 `, f. }4 K- x3 E/ n
            default: monthString = "Invalid month";8 a: K4 _! m) S7 a" T' y. J
                     break;
, S$ p9 H6 T% a! Y9 h  b0 Z        }* U2 R! r% `+ C$ F1 ^& }" f+ E
        System.out.println(monthString);7 h2 }1 w* t" o" o. r7 w7 ?
    }
6 x3 a3 k2 ^( K( p& x" \6 F6 k}
. y8 J$ I2 I4 @" q0 C在这种情况下,八月打印到标准输出。
3 U2 x' b$ b* kswitch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其
; g( y7 B0 y- [4 Z' _/ Z' a
2 D" s7 J; `* t  K" t' B表达,然后执行的所有语句,遵循匹配的case标号。* f# z/ c7 K4 h- A
你也可以显示每个月的名称与if-then-else语句:
% g3 I7 ?$ Y2 V. Q6 ~, j; }7 ]; Xnt month = 8;
4 k$ X7 A# ^3 Y: x$ ?$ l7 i6 dif (month == 1) {
/ l) k9 Y8 q; t4 Q  N    System.out.println("January");
+ e/ D) B6 N3 Z9 L4 u} else if (month == 2) {, Y& |. O3 d' O. t+ n: @7 i
    System.out.println("February");7 n5 {. t( K% y' E2 q" X
}
1 q% _0 _7 S" m  J. K# O$ B2 u...  // 等等
6 l! B; A! s. u: v" X; r7 P& Y. A9 W! p# f+ ]& q: C
决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可
( a/ c+ [3 v) s  k: Z- T( b! u& {+ |# X  J6 s! W' V
以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。  D1 W( G  L4 Q6 C5 n/ ]
另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语
9 k4 W; _( a3 v# v( e1 V
9 c9 C/ x  `/ F7 i& s7 W- f# T句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论" B! W  w5 e, }- |4 }' t; T* A+ K8 H

& E, c& u$ F% d. X后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落) q# E% K2 S* R8 y5 p' M
( Y+ p8 c" L5 k6 l
空。该程序显示对应的整数月和月,按照年月:
8 F* v. J; J9 i' s9 K; T8 e7 j: opublic class SwitchDemoFallThrough {
. O* m; }3 m7 W" O8 k4 W9 u4 {; X/ Y, T
    public static void main(String[] args) {
8 G- G9 K1 _, t/ ?3 y; c. Q" D        java.util.ArrayList<String> futureMonths =
  H( C$ M' [  j0 S            new java.util.ArrayList<String>();
1 h* x+ p$ X( {7 Q& V1 Z  G; M& o
/ p- ~6 ~* S+ Z& \        int month = 8;& ?; ?/ [: k( w" u  `4 v- R( |

6 I1 B1 f5 X- T5 ^# V% H        switch (month) {" X4 e/ S$ ~/ G5 Z/ n# f- G. }
            case 1:  futureMonths.add("January");/ @4 ~; Z; G6 ?4 C) I4 S
            case 2:  futureMonths.add("February");1 k7 q+ x# m. l; S; T8 B* V
            case 3:  futureMonths.add("March");0 f- U% R8 c' z! E4 r
            case 4:  futureMonths.add("April");2 _* `0 V1 d" [' \- I: H# U
            case 5:  futureMonths.add("May");
! E. {) ^  W8 ]) U  Z4 r. G, n, D            case 6:  futureMonths.add("June");: }- ?" s/ X- i6 u* _
            case 7:  futureMonths.add("July");; O# U$ P) P% J9 `; l
            case 8:  futureMonths.add("August");
& O& B, ?6 P* w/ r9 H4 F  V            case 9:  futureMonths.add("September");" F- S0 M+ P1 U! U* a4 m  Q
            case 10: futureMonths.add("October");/ A1 i3 s, Q8 N3 T3 `
            case 11: futureMonths.add("November");
0 }+ a( {5 z+ B: ^            case 12: futureMonths.add("December");8 a4 w$ S* o$ N9 e5 r6 I& x
                     break;* H0 C) Z) ^' n% k; X
            default: break;
7 T1 A- o& \! N7 `        }' q" H& Z$ k* H5 j- g' P

9 x, U* j1 m! O1 H- L        if (futureMonths.isEmpty()) {
7 [  N" s& }/ v% m' G            System.out.println("Invalid month number");+ L/ R& F; k* q, \4 `
        } else {
! W! l+ l3 Z4 Z. G8 |& d            for (String monthName : futureMonths) {% A7 W, U4 ^8 e$ I3 g
               System.out.println(monthName);
% E) k. ?- l! f6 P, S            }& N* C+ Y7 H) ]$ A4 g% f
        }
. g( X$ G" D$ J4 ?5 t1 V    }8 y+ H! S' r* R+ n
}
4 x+ M7 N5 i4 @& [' \( j0 \这是从代码的输出:
2 _$ n2 i( `! a# a+ `, s9 w) p1 e3 e5 J+ h
August5 m& {! x: G2 ?- e% v( a: [
September
; s" S. Y1 F& g3 lOctober; X* o- c# L* v* i' @
November- a2 {2 \0 b5 w0 h
December
9 @- T% q8 o0 u; O5 D- v! z! O! g& S5 X" w% z* G
从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不
6 Q  M& J( I/ D& s* P
7 ~$ o! f5 k* h# V9 Y容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。
$ s# b  f" m9 ^  Z8 S( C2 `下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数& I. c( i  R" o9 I  k6 d* F
6 R- w% ~+ [" I% p8 E* k$ g) [
, X6 g, Y% Z$ z, i
class SwitchDemo2 {: U8 E4 ~5 m8 V* @6 s- i/ n
    public static void main(String[] args) {
. J3 O. c5 R* T% W& u7 O: m2 @- ^7 r: I! y" }
        int month = 2;
% V+ E! Z" f4 g& q/ L        int year = 2000;
3 l, J" K1 ^5 A        int numDays = 0;5 `7 J  D' Q, }! \; \7 _
' p( e+ x5 S# z9 x$ V* P
        switch (month) {
, s2 A4 `3 d0 J! r1 S- ?. o            case 1: case 3: case 5:( w4 d6 c3 w$ R! b
            case 7: case 8: case 10:
0 o$ e+ \6 Y& s- m1 h$ z" p            case 12:! D+ v5 q7 y6 y1 r# K# E( p
                numDays = 31;/ m  g" p' p% ]" t
                break;' C' ~7 @7 `4 j4 R6 r
            case 4: case 6:5 ?+ B: B' h1 B0 s0 o0 e/ N; \
            case 9: case 11:4 U! K: W3 @9 I& ^; Z& q
                numDays = 30;; ^# c9 Z3 r) E' s
                break;
$ ~9 O( |( S5 f4 v- ?& N9 j            case 2:
4 Q1 z, b1 c5 G. g. m                if (((year % 4 == 0) &&
, j6 _8 }) a% K7 s* m. Z; C                     !(year % 100 == 0))$ O3 R5 R0 F, q, ?8 E# O
                     || (year % 400 == 0))
1 l, |( e1 o3 S, {                    numDays = 29;
& r* r2 C: d. y( G- o                else! V. @- B- `7 m! G
                    numDays = 28;
( ^1 X* s$ C% S4 p; L# Q: [                break;4 x- \1 N) x- U& F( r2 P
            default:+ H5 `3 J: J. Y- i* Z
                System.out.println("Invalid month.");" R& }3 y- L2 u7 K
                break;
8 [9 G% {# S, ~1 W4 O9 _" I% F9 R        }
9 i7 p* x7 s" b! I, j- Z7 C/ }  `        System.out.println("Number of Days = "# E, K1 T; b* W. ^. q* J
                           + numDays);
" {, Y( q% A6 l/ D; Z: w# [/ x    }
7 [+ g& h, ^7 P1 D}2 k# ~" j; e4 v6 e
这是从代码的输出:' x% o3 q. W% U- g; C; ?9 T3 t9 |: v
Number of Days = 29
0 r3 C6 f; i# K/ c1 g4 S4 `$ d6 |8 I3 `, U1 Y  [+ S
二、在switch语句中使用字符串9 R# W, e# g' X) H& r' n( |6 i
在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,
2 f% m) l0 l* N$ t2 D$ i
1 k$ M8 c) ~( ~2 o+ o5 n5 n" istringswitchdemo,展示了基于字符串的值为月的月数:9 X, `  {; P0 D$ P$ g

# `# m( c! x% S" M% d7 Hpublic class StringSwitchDemo {
5 {8 _7 \0 u% Z5 F) X: M8 L& \
; ^. ^: \1 c) L. N2 ^. O2 a; D* q! K    public static int getMonthNumber(String month) {/ ?4 T: F$ C6 x$ D9 e8 e

# E' ]( @3 ?0 f        int monthNumber = 0;
; l6 ~5 _/ A2 b# ?# j; w9 r
$ Q" y( J% \* ?6 m4 {4 G        if (month == null) {
/ x4 x9 w4 K( p( C            return monthNumber;9 K. a$ d. @  H6 X
        }  ]' @8 l; o7 N. F
1 b* d& V* y; {( i: A0 M% J
        switch (month.toLowerCase()) {
) R) M, G; y4 X* }            case "january":
9 q$ g( f& y: C& v                monthNumber = 1;
% s+ y, Y0 X0 x  p, G0 N                break;. Y, M  i% j9 `2 A& L2 P
            case "february":% g: f( V+ V4 w' @
                monthNumber = 2;
4 z3 U2 N0 I+ Z% d3 a  v7 g' t! L0 c                break;
$ C# o$ e! }8 L# t6 D            case "march":
% L+ [8 ?1 X/ s                monthNumber = 3;
( g2 b( T# A( g+ z                break;* z% b! g3 y. G
            case "april":* n' L8 k; `# N2 m7 h  ?6 H$ o( b, E
                monthNumber = 4;* y8 k# O0 D7 v% v! w4 Z! `6 W
                break;% d3 e6 }5 p1 ?. x7 R: t
            case "may":2 G3 w7 m. F9 d. h
                monthNumber = 5;
$ F  e$ e- d7 p, P6 f0 A" ~                break;
8 B; V/ |/ I; b4 w  \- U" [! B            case "june":2 S( F5 f$ G" c
                monthNumber = 6;
: E1 [1 d8 a) m. B, \                break;" V" w) t: l) \+ J( q' V
            case "july":
+ A3 W8 x& S% Y& g5 @                monthNumber = 7;; Q) c1 p" K' y+ N6 x7 t
                break;9 v1 b% n5 n" `( Q& A- }  I2 M& b* f1 [
            case "august":
8 b' @3 b7 X% o) h. f2 x0 x                monthNumber = 8;( `( |) M9 ]) p4 ?: n; Z
                break;
! `" w3 R% q1 m! r            case "september":' ?2 k9 n$ R2 M; q' e/ K
                monthNumber = 9;
4 |  N6 W2 x* ?2 T9 j                break;7 H1 B+ ]/ u7 H5 L( |$ Q; S
            case "october":" ]2 L3 O& w1 Z1 w% l
                monthNumber = 10;
' M6 Z" }$ U6 c2 C6 G                break;0 q# E8 H, `# T* z
            case "november":
5 z# n* Z; h' Q/ Z4 w7 q' j: U/ J                monthNumber = 11;: w0 c1 W3 w! z5 j. a0 r& F
                break;
% V+ X+ T  n  F2 o# I- _            case "december":  B5 e) D2 @4 @
                monthNumber = 12;2 W$ Y" E, K8 i: H
                break;( `7 i7 g. M0 C
            default:
) a% B4 i# Y; ]                monthNumber = 0;
) ^* Q+ T% y  ]# {; c) \: Y                break;8 ], H. P0 C$ E4 \
        }
; t# \8 L; c/ N
% Y. {/ G. [  w; i9 J0 q# v        return monthNumber;$ |* l) u; ?0 D
    }
6 k: P+ l" T( X; }  ]- \" r# x/ M! O2 C* `% ~8 ~/ [
    public static void main(String[] args) {1 D# |$ T) C! I2 b, C4 K
1 G* s; ?) U* ]* r3 g% v2 Q
        String month = "August";
* q3 ?! `8 f8 X/ e5 U: R) v* c8 N0 l) t9 U+ N4 E! Z0 {% _- i; o
        int returnedMonthNumber =
* ?8 }6 X9 X# X/ i4 P6 ?            StringSwitchDemo.getMonthNumber(month);+ O) ~% o8 \8 B5 P8 d

' x+ y; j4 K" e. q, C4 H        if (returnedMonthNumber == 0) {
4 n+ }. Y1 t) P6 n            System.out.println("Invalid month");0 a& a. w) y6 F0 y
        } else {) }# [5 H0 D2 c( B1 r
            System.out.println(returnedMonthNumber);4 A- c( w. R4 B$ I( F3 W
        }
7 a( C/ k' Q, ?    }/ s# }& w0 d2 n# f' H
}) f' G0 i4 D9 H, j# S
从这个代码的输出是 8.
9 W; Q: N8 P3 ]switch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了
5 [1 E" d0 A1 k/ V5 w3 `2 Q, i: M* c! \  S) b6 R! O3 E
stringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符
$ @9 Z- U0 ~. x! b* i" h/ [6 A" r
串小写标签。1 G. y4 N" o5 Y: l
注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个' o9 b% D7 P# Z, w  p+ S. ~
# a/ S# L- P8 ~- b3 ~# ~/ W% y+ E
NullPointerException异常被抛出。7 Y7 ^$ {& r  y, P
本文转载于toceansoft.com
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

GMT+8, 2025-5-23 06:36

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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