找回密码
 加入后院

QQ登录

只需一步,快速开始

搜索
查看: 650|回复: 0

一、switch语句的使用

[复制链接]
发表于 2015-5-5 11:23 | 显示全部楼层 |阅读模式
一、switch语句的使用* Y1 X- [' Y7 B+ x5 @
而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和$ @2 S1 t; g9 ]

8 g% m" r4 @7 E; Y# U# c原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始
# U5 J7 ~' z- d8 e5 S3 b* p. l& w! {* N6 X) q
类型:字符,字节,短,和整数(在数字和字符串的讨论)。2 a# S; V9 V# n0 r1 J$ S/ I
下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值
7 a% D4 u) V) C$ B& w! \+ W. W  q7 M4 f" a0 [4 E! Z  l6 M
,使用switch语句。
0 B  u/ ^( b. o' e  jpublic class SwitchDemo {
( W& l1 T0 p" h$ {! n# K    public static void main(String[] args) {3 W- u( D% F) C( }
& z+ o* G6 F! `; H
        int month = 8;" V/ A! h$ w6 ]2 S. v
        String monthString;
# S7 T! f, l( u        switch (month) {
+ {5 K. r1 {( |" T  R' \2 ]            case 1:  monthString = "January";
/ x7 W9 `5 G8 w. ]1 S9 {                     break;
" n6 i' b* e8 g% _: y            case 2:  monthString = "February";
$ B, O+ E5 v2 ?) N! {, y                     break;& G! c7 \8 _3 f0 T4 D- e) f6 f
            case 3:  monthString = "March";  h% Q6 p3 Y7 |, ~$ u9 g
                     break;
+ ]: m5 x( J4 n. s& u8 S! R: ]* |- K! ]+ q: g            case 4:  monthString = "April";  n$ }0 }: u. K) @7 {
                     break;3 {$ O; u' ]+ S; A" l
            case 5:  monthString = "May";
$ S9 w5 k5 c$ p1 o  o! o6 a8 T4 m                     break;
4 G7 y3 A9 Z+ l! e            case 6:  monthString = "June";: |; d. g' H. C- L7 A
                     break;
9 E7 u; ]- p1 L            case 7:  monthString = "July";7 Z: u$ K" s5 i' O
                     break;) q* f1 {0 M) y8 c: ~: y3 b
            case 8:  monthString = "August";; B- v! X( }% h& V" j4 n
                     break;
; L# M1 y" O; M            case 9:  monthString = "September";5 i. e4 j9 `3 U1 C+ B
                     break;1 |5 ~- y9 h- W' c& Y: i3 |
            case 10: monthString = "October";3 o. w: o, `  \0 Q" |
                     break;' R0 J6 Q) c# h) z4 g2 h1 |
            case 11: monthString = "November";1 z, m  t9 B* ~- s
                     break;! X0 q$ `1 K. ?" |3 v
            case 12: monthString = "December";  R* _- ^3 g0 T: [4 E; z7 P! L# W
                     break;1 _) T# [: A' o) e: o
            default: monthString = "Invalid month";3 S+ x, H( w+ `8 Q& J
                     break;2 H+ a3 ~* ]: Z; V7 g) H9 U7 S
        }
6 \2 _1 q- s# G& Y6 o( X3 _8 l3 \2 ^        System.out.println(monthString);# d' n8 }7 I) j8 ^
    }3 v  ^8 k$ ]$ K$ L4 ^
}
5 y, H( {+ a% W: b7 ]4 J* b/ R+ T5 W+ @在这种情况下,八月打印到标准输出。+ U; K; W* H& [, M/ z
switch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其
. e. R3 h2 G# D8 L2 D, F% i6 C4 f% M; g! I. _/ p# k
表达,然后执行的所有语句,遵循匹配的case标号。
* R! z/ r/ o7 }你也可以显示每个月的名称与if-then-else语句:
. t( X8 ?' j) E1 F# J4 z9 ]  Ynt month = 8;
: X  v! Y" o. E6 P7 a1 O- h4 ^: gif (month == 1) {) N0 o' I. r, `" T6 ], l! H+ V: x
    System.out.println("January");
9 }% R0 V2 w0 S; K} else if (month == 2) {' O) s+ t# N; B  m; C% h- u
    System.out.println("February");& Y. `5 L9 \3 u1 p3 J
}
- ^% S1 a  L+ E...  // 等等% }# G$ |0 P" `" ~" E4 \! V
9 l4 X2 ~- m. M
决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可* h0 G) V: f; g, \

' U/ }( H$ K9 L0 I7 N" F以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。0 N1 d& c2 p, C: o( b& Q* M! f
另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语% H! R9 T) U0 m4 n4 o% c. z6 W
% C( W& O8 }+ R1 S, |9 p
句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论
+ @( i3 J' s* c+ P) P1 g: k1 d4 P9 ?8 p) k$ [
后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落# c/ [! K' F* a+ n# [
, u7 @2 M* i! `- u1 W# v3 y8 W
空。该程序显示对应的整数月和月,按照年月:
. K8 t( V3 C4 x2 u. R, Jpublic class SwitchDemoFallThrough {5 N4 Y) e4 a. S

2 Y9 D" w; ?1 f4 y0 j+ p' D0 S    public static void main(String[] args) {; i- r2 ~' v8 S& Q4 J. d* X; T
        java.util.ArrayList<String> futureMonths =7 l2 [6 J! y( m3 c. Q
            new java.util.ArrayList<String>();
' I; O# f1 w' h: _; w6 X. u3 `0 Y9 e9 l- v, }
        int month = 8;
' Z  d3 F6 ?1 `% G8 A% U3 o( w/ N3 `- q
        switch (month) {
8 ], e' _1 X- _3 h            case 1:  futureMonths.add("January");8 d  o; E$ D* G9 X' z
            case 2:  futureMonths.add("February");
6 T2 e! _2 q% E4 c9 H! B1 E& e            case 3:  futureMonths.add("March");" z) X% V7 s+ x; g; @9 O4 U! i. e
            case 4:  futureMonths.add("April");
. I) G! g+ u( I; Z* }, z: w( O1 u            case 5:  futureMonths.add("May");
1 r* {3 ^: |% _* P) y; V) v            case 6:  futureMonths.add("June");
" ?0 a% @8 X$ O. Y3 I% p. K3 W            case 7:  futureMonths.add("July");
5 F4 ?* [: |4 W, t6 I$ d2 a1 q            case 8:  futureMonths.add("August");
  g( e2 F; ]. S& n' ~            case 9:  futureMonths.add("September");1 X# {7 N* `* ~: m: m: |' g+ f
            case 10: futureMonths.add("October");4 d; q% x  m' A8 w* a! I
            case 11: futureMonths.add("November");
$ P6 w& U/ |, b+ O: M            case 12: futureMonths.add("December");
6 \- g! S4 Y8 L                     break;
# l$ d" i5 K) ^* m& ]: g  Y+ M            default: break;, q/ P$ N0 ^. n8 k# Y8 a0 q
        }; I0 [! k- h& P- I1 n

7 @* [5 p2 ~2 w1 t( W        if (futureMonths.isEmpty()) {& w8 O- E! v5 q
            System.out.println("Invalid month number");
) W% G3 ]( A  o7 p5 f9 W/ V6 F( `        } else {
- E4 A7 @$ f1 N4 z/ J4 |            for (String monthName : futureMonths) {# k0 K0 R. F( c
               System.out.println(monthName);' \8 b9 ^1 \: g2 I  l
            }; s" D$ H/ q. V& E6 z2 G
        }$ [$ J+ G; w9 I2 i
    }. L' ]9 f! B4 O: z2 o1 ?3 T7 _
}
( a  t; @, E& C# }$ {. `0 I. F这是从代码的输出:
; o6 B& K1 ^1 b4 K, y, g- H8 x3 [& ^  u- g! g( c+ T
August; u  K% J; f# k8 [0 O4 a! S
September5 c8 y$ t0 O$ A. z& q6 h" q
October/ D* d! E6 A: f
November
* h" E+ \# s6 C! w; GDecember0 c/ w/ u8 p0 ]

0 F" n9 U& U7 g# P/ M! ?5 X3 M' i从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不0 z' T; T8 Y2 {; P4 K
: K4 O0 k! q. X) G- e0 s9 r+ z' g
容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。, J( N: w. g* m
下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数; |6 ?  ^. q& i3 \- I

9 E1 u- H3 i2 `0 r# O0 X, K5 d& s' c
% n! j4 J+ x" O+ zclass SwitchDemo2 {
7 `$ d. }1 T5 D* R8 ]    public static void main(String[] args) {
0 r3 b7 I$ I; K. K$ O) X0 r5 ]
+ x0 X4 T0 e( w- n* ^. r/ A: _        int month = 2;3 L) S+ ?* l$ `2 ^; Z3 [
        int year = 2000;2 z) n) n6 t) r
        int numDays = 0;
. k4 U! K* ]2 V7 k
% y) d8 G! O  E/ L        switch (month) {
' b, {' N' X6 e# e5 |            case 1: case 3: case 5:! [1 n! U8 k9 U5 `- T  }8 `
            case 7: case 8: case 10:  W) \. t9 _8 K1 d0 ~: ^" P
            case 12:2 p/ K) C, t& I/ C! c4 G
                numDays = 31;( u* s) G& ]& w  O, W
                break;2 O& y$ `; P) Y8 g
            case 4: case 6:
4 T, R: q4 k" b3 b            case 9: case 11:
0 T! V& ]+ _% v6 l  E% Q% g/ p                numDays = 30;1 P6 j# ?0 Z' K6 Y
                break;1 T7 b) b; K3 W
            case 2:- P8 q5 I0 L5 n& W  @
                if (((year % 4 == 0) && + k6 m7 S7 W# `2 ]: I( C! Y5 X4 k
                     !(year % 100 == 0))( M! k; F5 m+ `! H( o6 L0 [
                     || (year % 400 == 0))" P! C+ |$ G3 ]$ x* j+ _5 \
                    numDays = 29;2 u9 \1 V! {4 K5 N
                else
  h' |' E1 y, n+ C( b) K                    numDays = 28;
1 ~+ u" z) P( V                break;
" n- ?/ b' N# C' s# ^" U! A& ~            default:, G6 Z6 h' Y! F7 P
                System.out.println("Invalid month.");
: ~, Z( E( d3 }- D2 R$ s' T                break;
3 Q, u, K% x  ?( X1 V( F1 I        }1 _8 G* H' _$ Q) ~4 B9 W, F9 ?
        System.out.println("Number of Days = "  ^1 z; C* M& x4 E3 A
                           + numDays);2 M/ ?$ c& z8 X; U7 U5 p( B
    }
3 ~, M( \" t3 o& v3 x; \3 o}4 ~5 S! q. y( I: C
这是从代码的输出:5 Q2 ?0 y$ v* [/ a0 {9 Y) L' T% B) `; z
Number of Days = 29
" c0 D: ~0 L" s6 G! D% z5 K3 u
3 j; Q$ i, ^% S5 j二、在switch语句中使用字符串- I5 I" `9 V4 n3 @
在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,
, x- A9 R2 e- M+ ^8 F! s+ i( R1 s3 x5 _8 j4 @
stringswitchdemo,展示了基于字符串的值为月的月数:
, \; v2 j3 p8 s
5 ]" o: N( g7 j& _4 `public class StringSwitchDemo {, x  a# ^  Q' D. L3 S4 m% `
! o# A, q! x9 Y* w. q
    public static int getMonthNumber(String month) {
& b$ V/ w- K0 B; h3 m
; ~: N- k0 ]3 f- e( f$ m* i3 |        int monthNumber = 0;
7 F* c# L) @) ~. [1 i$ s
+ B5 ?& y+ _& V6 r' [" J        if (month == null) {7 _0 X$ q6 l" @4 f/ R! a
            return monthNumber;" U+ p8 l/ P; k0 y
        }9 a8 N" s" |: x+ S0 K4 B, [( L
& A9 c. K. s+ ~, b4 v6 w
        switch (month.toLowerCase()) {
8 `6 r* P' e: V& I/ t            case "january":  |0 Z7 Y5 [. I  S5 t2 {- u
                monthNumber = 1;
) b; m" p* q+ z2 H/ x% p4 q1 k                break;6 }2 V" p" g0 \$ |
            case "february":1 Y- Z8 y; y" C! x( d) `
                monthNumber = 2;
. m) p8 \0 J9 }6 ?* f                break;' }' p! h/ Q, Q3 Q& h8 E5 w5 D
            case "march":
3 Y" ^' O: v" W9 A                monthNumber = 3;$ F+ [- G. ^* `4 Y% Z, i
                break;6 o( H) {" d, z/ H8 l
            case "april":
4 v7 q! l7 f% X+ k0 M                monthNumber = 4;2 i2 Q  [* R8 v# f8 ]. V6 G% Y
                break;
9 o2 q: k1 p% v: m, q3 s            case "may":9 T; P1 X6 a7 {; M" d) T+ P
                monthNumber = 5;% s3 Y/ ^3 v4 ]. W8 j8 S3 X9 h
                break;
. @* x( {* Z( H' Q8 Z            case "june":/ f1 ]8 I! }- ^1 g/ J9 M
                monthNumber = 6;4 R2 j% \% ~- }' u8 d. I
                break;
- U% G0 e& ~9 }4 u" t) p% H6 h2 ?: N* _            case "july":4 I7 e; \) B/ p) b' E
                monthNumber = 7;
/ j0 m  F2 t% ~% o* u1 `# V+ Q                break;
7 t. g9 t& \* C- Y6 ?( k; |4 I            case "august":% m0 \, j4 T8 e
                monthNumber = 8;
. q: G/ j3 f& G# e, N0 S2 u6 b                break;3 P, N2 u4 _" t) Q  }. m+ ^
            case "september":
; f+ ~9 b" f3 z; B/ b8 D( V! j                monthNumber = 9;. H: X' C( M  h8 e+ s
                break;
& l* b  T# b. o: a            case "october":% @3 H+ M" N" z; H8 c
                monthNumber = 10;
/ v. q% w% F, E. y2 d$ F5 A& ^3 Q' v                break;: H4 l; @0 U3 n0 ?; P1 O
            case "november":
% A/ v5 z: j6 X* d. Y% {                monthNumber = 11;, J* ]% [; N8 z3 Q
                break;
& l/ x3 S0 z% s( t            case "december":7 Q( l% x% y3 a
                monthNumber = 12;, {1 I$ m% J1 p4 j
                break;
. [" Q$ T7 P( @' Q            default:
; p& s0 |1 S9 b                monthNumber = 0;
: a/ |; o8 W6 {# }' I6 q                break;
3 M6 S2 a7 n9 c. m) V. u        }+ Q5 c* w2 j7 g4 o2 c4 L7 E# D
& v( @9 _7 D( e5 b5 G1 k. I* i
        return monthNumber;
& ]8 Y& r- |, E2 |7 l2 `6 m    }- A+ l- \, B+ |3 i, @

* h- A- p3 M, m1 R' T* n    public static void main(String[] args) {+ t8 \% [# |: T1 Z
& c& h4 n  t: I5 h
        String month = "August";  k% [. x9 E9 D& L
: O* E7 V7 _# ^* T
        int returnedMonthNumber =
: Q$ E. L* Q/ D7 R9 ?            StringSwitchDemo.getMonthNumber(month);
5 d1 {; R( d, e  N8 l0 m$ Q
7 R# H6 I+ l- @  c% Y        if (returnedMonthNumber == 0) {
) a4 H# X- d0 \3 u9 {8 H            System.out.println("Invalid month");
1 m9 j8 [+ X$ N3 g$ A" T$ I: f        } else {
6 B: f! ~% K2 U' ^( s& T' O            System.out.println(returnedMonthNumber);/ k+ I3 w" n! X
        }
, \+ f. t  C( \; R    }8 L, l0 _6 u7 ]/ {/ A2 V; {4 U% r
}
# {+ o( K2 o) U8 Y从这个代码的输出是 8.9 J; L: m! }! g4 {
switch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了+ T# A9 \  N" V/ ?" p5 {
! }! g8 f" u" \& X$ v+ |
stringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符5 U- G4 d4 q9 G+ f% q3 V

5 W% |* v9 F* T串小写标签。8 F+ `1 j, ?; A- g5 {) Y" s
注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个$ K  `0 a4 N, s. |3 ^' K( J
  w- t5 n7 ^. H  @( b6 q6 j% {( N4 {
NullPointerException异常被抛出。4 Z/ b8 E. S/ U  u2 F3 \
本文转载于toceansoft.com
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

GMT+8, 2026-6-15 02:44

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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