工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 465|回复: 0

一、switch语句的使用

[复制链接]
发表于 2015-5-5 11:23 | 显示全部楼层 |阅读模式
一、switch语句的使用
  ~4 _; k, z2 j- |) P  A1 r而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和
8 c  N1 A" o: D, H, i: h: d$ Q2 g$ r; t) p( P; `
原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始& F$ Y: c9 \0 W9 w  _

5 `9 ^4 G4 l4 j; T4 j9 `" y, J类型:字符,字节,短,和整数(在数字和字符串的讨论)。4 m) J2 C" p2 L7 r% N4 T4 p
下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值. ]( n# g+ V# B9 y/ ?; e2 m4 o, ?
9 b9 r/ j! P4 U; L0 ]5 A
,使用switch语句。  P, j7 i: Q% {1 G- X$ q
public class SwitchDemo {8 @# |" Q- r9 ^( z( U; ^' d" O6 X! x: A9 z
    public static void main(String[] args) {) t9 p2 r1 t" a6 g/ v

; a& L; J* f5 R7 @        int month = 8;+ Y) R0 e* e9 T. o& y  k
        String monthString;& W* I( o7 C* f+ Q
        switch (month) {
) @( L5 Z5 _2 O: h            case 1:  monthString = "January";
- m. X* @3 X8 J$ h, ^! y                     break;6 Q( a; p, V+ z4 D" e( K
            case 2:  monthString = "February";
) D8 O' Z: O. U) A, C                     break;
+ b: h8 A+ z) {' D- }) j            case 3:  monthString = "March";* \8 {  A: N8 T3 h
                     break;! y! o7 M  c* P) g' k4 H! z4 i. N6 x
            case 4:  monthString = "April";
- E: [) K$ _; |/ D                     break;) T& z7 D/ l' B
            case 5:  monthString = "May";3 c  f2 E3 r  z4 o9 X
                     break;4 H5 Y" L1 V( [1 U* R; ~1 A
            case 6:  monthString = "June";
) [+ N- v4 j8 Q4 g6 H                     break;
9 P0 y: e3 O  s6 Y3 ~5 a. Z; G0 r            case 7:  monthString = "July";, U7 J, {) k( s0 {: Y- |5 y
                     break;  s9 d9 |! X) o" G& q  D
            case 8:  monthString = "August";
  H9 T* I  G  q  C                     break;
& S9 o+ F- e2 w3 E+ D/ N0 [5 J+ d            case 9:  monthString = "September";4 i. D$ u4 f& F, e, y: @
                     break;' T' S+ q; S4 K, \9 U2 g
            case 10: monthString = "October";
- L: N& U  o- L! J5 q6 u                     break;, C; M" o. p7 ?; R( F) @% ?+ V- E3 p* X
            case 11: monthString = "November";6 ]7 h8 {5 u+ D1 R: ]
                     break;
6 J# b. c* T5 Q+ Q+ W5 A1 F            case 12: monthString = "December";; E; U* Q4 R, B* |
                     break;
# |7 ~6 j0 C1 \; q8 z4 _            default: monthString = "Invalid month";; M+ j( j4 @0 r( }* ]* ]
                     break;
. p9 Q3 @+ ~! K) `* R; t        }. j* z& r! g+ O9 l2 |
        System.out.println(monthString);! `2 n" l2 j# f- X$ u
    }
; ~8 j  I& g3 K0 g& ]8 i8 k}
' Z9 |5 Z' z: U: j% i在这种情况下,八月打印到标准输出。
  m2 M4 ?3 ^0 {! s9 b0 k2 n" Q% Mswitch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其! |& j# _8 U$ N" d4 b4 f; @9 Y
6 w, E1 K6 ~  `# Q  |! g
表达,然后执行的所有语句,遵循匹配的case标号。
$ Z. t# l4 U1 l& t9 x5 f- J你也可以显示每个月的名称与if-then-else语句:2 B0 m. _2 |- z* E& ~! U$ ?
nt month = 8;9 ~- E# u: e2 f# @
if (month == 1) {
3 }! G4 q) ~% o- _, y3 X    System.out.println("January");
- D) E; B9 @1 G' ?- B' y5 n( J} else if (month == 2) {, `2 h" g5 \8 P0 C
    System.out.println("February");
: Q4 i, Z5 \5 k' k. y0 N$ F1 h}
6 U# w, {3 L% _: D* N1 g& t" g...  // 等等
9 m. s; T, w0 P
( }& |, d- y  I- y. m. R5 x  q- ^决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可! O+ T) z) O- I: l

% Y$ E: ]5 q. e以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。7 w4 B4 a  \/ T' G- L/ a2 X
另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语9 \& E+ c! W( ?* P* z9 g' ^( j

$ {! v8 H2 b7 D7 a+ j" c句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论
7 T7 {! t8 E0 X* _: A
( O8 J9 D3 V# V1 Q; w后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落
  J4 w$ `" N$ f1 P; o, M4 _  t3 o& q+ P6 @+ V6 H
空。该程序显示对应的整数月和月,按照年月:
% ?" d% R0 u  @9 `  Jpublic class SwitchDemoFallThrough {
$ u) y; t3 t: ^0 c. b( d9 u! i( y4 u+ _0 O1 J2 x
    public static void main(String[] args) {
. X( v) \# W7 J* f  a$ Q7 P' B        java.util.ArrayList<String> futureMonths =4 e: _# @1 G. @# x. [8 B" j: a! p3 a
            new java.util.ArrayList<String>();
% }( s& {4 s5 k+ z
; ~. t, _' N$ V  c        int month = 8;1 _; a' x& }) f$ z  P2 F: s4 y

; B+ A3 p4 i9 H        switch (month) {; l* f; r! o2 d& Q4 k
            case 1:  futureMonths.add("January");
# e5 d9 b, o! N) u+ u5 D: ?7 E1 W, d            case 2:  futureMonths.add("February");
- Q8 s8 L! y$ ~. M+ b            case 3:  futureMonths.add("March");4 q  Y9 O8 x- ?6 b" H* X
            case 4:  futureMonths.add("April");
* t, s5 ?2 S6 [% r            case 5:  futureMonths.add("May");4 W5 M* [8 L' N$ o+ y2 K
            case 6:  futureMonths.add("June");( r2 X/ n! r# ]5 X7 y4 t
            case 7:  futureMonths.add("July");0 @9 H& A9 P$ H3 K
            case 8:  futureMonths.add("August");! W4 s. G7 J: p% ~0 W
            case 9:  futureMonths.add("September");
2 I* ?! S( ^- `6 ^; `9 P% c            case 10: futureMonths.add("October");3 l* z% F- J+ [& H& C; r
            case 11: futureMonths.add("November");8 B; @2 r, h. T
            case 12: futureMonths.add("December");
2 r6 Y3 x  S- ?& i/ H4 [( d                     break;
; l2 b" N0 @# H3 z  y, i; n            default: break;7 u1 ~+ T3 q2 y7 m$ _
        }3 ]3 z8 b0 O* [

7 p. B. [! G8 a7 }$ s8 H        if (futureMonths.isEmpty()) {
7 Z; H( x! R8 q, G! l+ J) u8 k) }            System.out.println("Invalid month number");5 c" e" k, Z' s* e: Z9 `  m) h( Q
        } else {' c" Y( h! l3 {8 c1 m  `
            for (String monthName : futureMonths) {
, {! D9 ]0 Y  O& K5 j               System.out.println(monthName);
8 y7 z, r5 z0 a4 }+ `3 d4 D            }; J  A, N7 h- ^
        }2 k* W  p" S; l; F6 H5 e& M
    }
! L7 ]  F. y3 U7 [0 a}) E( ~( o! K: B0 [( R4 l* w* j! _
这是从代码的输出:
" `0 L+ R( e( O; j3 P( c" O5 q% e. C5 Q) T$ Z9 w
August
2 N1 B0 K+ y: |September% u! }" t2 P8 A# X" q8 s  ?
October
, m* T2 P$ g! i9 ]+ bNovember5 S7 n" q) U0 ^4 w
December5 u! |% E  f2 h- J% ^, O. |

/ A0 c* S9 j, K/ ?从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不
- V' Z  w) q. b  h  J$ H: S" a; P
容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。( Q* i% z* \# T, @
下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数' h  m7 D! N& B' S" X
6 G9 l& {/ c4 P( J- i

" X3 B: P' I& P, C" ^% E+ [- Vclass SwitchDemo2 {/ y) n  R# z% j4 Y% D
    public static void main(String[] args) {
! y" z. L0 k. H" F
/ Q" V* f0 S( Y        int month = 2;
8 P" d- o6 j* H' L7 I" P2 h  ^: r        int year = 2000;
) r7 D( |+ w9 X! x' L+ Z        int numDays = 0;
1 }) J$ _* S9 o9 u) s- f4 f
7 X) n* ~' m9 z) p        switch (month) {
& N5 G+ }! u3 }& Q            case 1: case 3: case 5:
/ \2 |" [7 c2 n& c            case 7: case 8: case 10:8 ?; V: y8 |( p3 c
            case 12:, ^+ \. a$ w* B8 N: d
                numDays = 31;
2 G; [- Q8 p0 F2 r$ U% ]                break;) R- @/ n8 V; Q# S' s2 O9 A% a+ M
            case 4: case 6:* }3 r$ }' b7 {& }$ o) T
            case 9: case 11:; A% e' z5 X- |( v0 O
                numDays = 30;
+ @# n* Z9 ?- \  ^3 R' Z                break;
- q/ q" s1 k# P: c            case 2:
$ b& p' u0 r) e; m# \$ V! N                if (((year % 4 == 0) && 4 v8 {7 w# N# I/ U& \6 J; Y
                     !(year % 100 == 0))
0 x- ?, y. {& J. _. U; v5 r                     || (year % 400 == 0))2 `& e! P+ u, V5 f5 H# y; D1 @0 o" V
                    numDays = 29;+ l, T1 a  K0 u3 d
                else
! T  w0 d. t& Q4 ]                    numDays = 28;, A+ C9 X0 Q. H4 q
                break;" P2 T0 z; z8 i2 R; s# J0 z3 J% w
            default:; z; d' Y3 F/ F- k- R1 X' D
                System.out.println("Invalid month.");% B8 u4 @# O3 v. `) X+ b& [
                break;
$ v1 u3 E, n) N% H) G% g        }
7 `) i/ a) D+ ]8 X        System.out.println("Number of Days = "
1 k4 \; i: ~5 \; d: k1 W& ~2 Z' E! p                           + numDays);3 h$ X+ H8 ]- a2 I' O, X
    }
3 ]0 z' U+ s. K1 }$ Q}
$ i8 Y7 p: r' _# k8 E这是从代码的输出:3 x; C. `0 g; b2 r) P. q0 \- s2 I
Number of Days = 29
4 \9 Z" u5 W% |3 j
4 J3 o6 |/ P2 ^1 O5 W, @( a二、在switch语句中使用字符串* j+ U& W3 r* |/ k7 F6 d: F1 W
在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,, Y+ d( C# N3 _
& g( D  ^0 ^6 c  U
stringswitchdemo,展示了基于字符串的值为月的月数:
6 Q/ A( ~. h( t# n2 J* X/ I% w5 r7 F7 N7 D3 W* t: e0 t
public class StringSwitchDemo {
: D5 q7 i3 j. o5 j- E. R0 s' Z0 C- C. P, f# c  N7 s# Q( ^6 J
    public static int getMonthNumber(String month) {. B5 D$ u& m. y( W) r

; z7 [" E$ ?$ \: [) p        int monthNumber = 0;
) M- j7 ]' W$ |( ~6 z+ m" l8 P( O8 L8 C4 j) F
        if (month == null) {6 n: ]$ I5 A& e2 m; ]
            return monthNumber;9 u6 j, v- R) B+ I# X% P2 x1 A9 f# E
        }
: e/ ~$ B1 P' w& P3 \
, G/ z* @& t* j3 L# Q$ G8 a8 d) Y        switch (month.toLowerCase()) {6 E8 n( |5 m4 W; u+ c; W  L+ X
            case "january":, b& S* r0 w, \* \8 T5 S& O
                monthNumber = 1;  y2 S- l: I1 T: w( j# E- K, @
                break;. O+ a( r5 M% H+ \% j2 t
            case "february":
' {- V1 }; @1 U% m, m                monthNumber = 2;
: q2 e7 g) P6 o  X1 @% J                break;. F/ n* ^2 ?* P
            case "march":
& a( z/ C9 m2 U                monthNumber = 3;
, a$ Y" g5 n7 ]" b$ j  ~1 y- f/ J" [                break;8 h5 C  [. \9 e" A1 H
            case "april":2 c0 \' ]# B. }6 U& p
                monthNumber = 4;
) _" Z* Y$ q$ n/ E: B) H& d% ?. b3 K                break;$ o5 g* d5 B& X3 o
            case "may":9 t8 Y+ r9 ^" F9 s
                monthNumber = 5;& e+ Q: ^# b8 ?' j% K9 B3 P
                break;
5 r7 b. I  n7 M6 l  \            case "june":
* y8 E- k' o" ]2 A9 Q/ r$ h) O: M                monthNumber = 6;
2 e7 A! L1 H8 h+ ?7 h. A" @                break;
" o0 \  Z2 X) E  M+ Y1 L4 s7 B            case "july":/ ^1 s. M+ g2 }! @$ x( Y
                monthNumber = 7;. q2 v& |# [& z
                break;
9 z  B2 y6 R7 o& r            case "august":
. Q# o( d% [/ s) m) a( V/ e                monthNumber = 8;
, H1 c( v" I! l3 t! R- s* V                break;0 ~7 u  p* \" X+ [
            case "september":: w; w1 \2 I" _1 p2 e, O3 I' |, h
                monthNumber = 9;
' _( {+ c( c6 P0 X4 J                break;
" z( u2 f2 f/ u8 R; I8 K' \            case "october":
, x( n# H8 A& z+ i, I  Z- Y+ m                monthNumber = 10;
+ b8 x6 B& t0 i, q$ Z5 @                break;
- Q1 ?7 D' H* f            case "november":
% ]: S4 K" N7 M( y5 n- R& {; c                monthNumber = 11;
# o0 [( S( `/ p9 i                break;
6 z: O- J. v, {; v            case "december":
, f) h! O' O3 s: n                monthNumber = 12;8 q* p- x% d! a/ [2 [/ h) X
                break;
; |1 n1 O& G+ ?# j% i3 C( _            default:
4 z: o4 ]2 Q  f4 O                monthNumber = 0;
2 @$ `) a% h+ H                break;8 P0 W" S9 [& F! D5 e) S& \9 {$ ~
        }% [" G8 h( C/ `" g; S2 \2 b- D
0 h9 R  t" z) e0 B  q7 |; e
        return monthNumber;
; @% _. L3 f6 n, b    }
0 J' W2 E. n' ^! _2 ]$ I6 x: E# k7 l4 T8 D
    public static void main(String[] args) {
' c  w  c: r  s5 ]1 R
5 R5 J. ]- ~$ k; h" l& K0 e& Q% o6 k% v8 C        String month = "August";6 y+ a8 D3 M3 B% E

( ?* m! t6 x% R1 L+ ?8 [3 H# \& B        int returnedMonthNumber =2 n, [- z4 @0 i. C  T* s0 e
            StringSwitchDemo.getMonthNumber(month);
) w8 x8 C& Z' `
. Q# t$ s4 B! o8 d        if (returnedMonthNumber == 0) {# a# Z8 {- ~8 d2 ]- C
            System.out.println("Invalid month");
& Q' m! n6 F) o' F7 u7 u: J        } else {
# ~* _1 h7 g8 m: ]5 s/ a$ b            System.out.println(returnedMonthNumber);, R+ D7 i) ~  l! g* P
        }) l8 G0 [6 E% ]" @+ H8 b" d' g
    }
% C9 F) |/ L2 L5 l& i) X" `}
: \/ T! M# Y6 _  a1 {  o4 g从这个代码的输出是 8.
* c, \; x# p. w+ aswitch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了: c  e. M; O7 F
* h4 l2 e( O) j) R
stringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符
; Y6 U; C7 @( u( r/ s8 N4 n( E/ G& j1 A: D  h, R5 @
串小写标签。# X' y/ G: B2 N; l4 W" ^; V
注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个: Q& L% a2 W5 h' P2 Y5 B0 `. k" @

, b/ N) U/ M3 ^7 K6 d. T* ZNullPointerException异常被抛出。3 E) ?: i; H9 b6 v9 Z
本文转载于toceansoft.com
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

GMT+8, 2024-6-7 16:56

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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