工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 480|回复: 0

一、switch语句的使用

[复制链接]
发表于 2015-5-5 11:23 | 显示全部楼层 |阅读模式
一、switch语句的使用1 s; r: d+ M' i" q+ K! G: o
而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和3 ?- D2 W, t; G, d' z% L

) p( H& A& r$ z  f& p4 H. I1 n8 r原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始
& q. D  s1 x$ C) x2 M% T7 N
. H+ S# d2 K. {) ~8 y" W0 }类型:字符,字节,短,和整数(在数字和字符串的讨论)。7 L  u& E4 E% ~: r$ d# ?" J& i
下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值
, J3 z% ~& J: I- ~, s% ?, R# J3 W5 B7 J+ Z7 d) o' l+ O
,使用switch语句。
- ~! J, g3 h9 E5 ppublic class SwitchDemo {
$ t, ?' L4 h' }7 A    public static void main(String[] args) {9 }& H0 g& f. k+ N

* J$ |' z( n; [: t' z8 X        int month = 8;
9 V* Z- Z* \) f/ i+ ^8 l- f        String monthString;
8 L3 w# c# L, w. ~3 h) V! x$ z        switch (month) {' c& {6 o: f- F; v( y
            case 1:  monthString = "January";
/ G# d  Y( x& ^, T3 h: u                     break;
. h2 l. J0 a" b& f8 x/ N" [. n9 x, N            case 2:  monthString = "February";8 [$ B* C( Z$ q: z& m
                     break;4 x* ]; }! {2 M' v0 Q* w" P' y" q
            case 3:  monthString = "March";
- L) u9 D$ `" K. j! V( b/ k                     break;  w  j) H/ q- ]5 z
            case 4:  monthString = "April";( g" a$ Z: i* [& R$ L/ r5 Y# Q
                     break;! Z( }, [5 N/ G) z1 |4 A
            case 5:  monthString = "May";
5 @7 ^* W* |7 Z# E; Y0 }* M                     break;8 I  S" M# `& y  {
            case 6:  monthString = "June";
% T3 u$ f3 C0 ]* f                     break;
  n1 a0 b/ }$ {            case 7:  monthString = "July";
. J6 I0 G' G% A9 F, ?* {                     break;
! c" I' Y, a) @! U            case 8:  monthString = "August";* j( l: }" `/ X( X
                     break;
1 e% w) V1 _8 Z' t; m. V            case 9:  monthString = "September";
* J4 }( X- Y0 b- k# e: @2 O5 O                     break;
( l' X5 M5 J3 ^9 j            case 10: monthString = "October";  h* G/ k! y9 S) G% s; h2 T  X
                     break;
" Q5 ]( }6 p* }. I. y. g0 L            case 11: monthString = "November";
4 T  C2 h' @, Y' `" C/ ]! b* ?                     break;/ V, \& T9 b  _1 e$ L: \
            case 12: monthString = "December";5 }. c, H2 K) b5 G( B
                     break;
3 N0 z. f& S( W& |/ ]) w* U            default: monthString = "Invalid month";
5 K; c2 _$ P2 V4 s                     break;
2 T1 e" S8 _* t5 f8 ~( ^% L        }2 R7 q% Q; L# M) ~
        System.out.println(monthString);- x4 J7 ]9 H+ M+ k  ~; b
    }/ i: \7 z  O$ Q1 E0 k
}
/ R6 C* V! N5 l0 m) Z在这种情况下,八月打印到标准输出。
) H( ?( y" b* c; E& g" a( Jswitch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其
" z  r! B) Q, G, ]1 K/ j" C4 f8 h3 c* ^' A
表达,然后执行的所有语句,遵循匹配的case标号。
" {0 g+ C/ w7 T3 K: H1 I" Z你也可以显示每个月的名称与if-then-else语句:
& O. i9 p. h1 ~! Snt month = 8;
& W, d# ^; C2 X( w& H+ gif (month == 1) {
8 l0 w! R9 C, J    System.out.println("January");  A+ `" y7 ]# A0 t  h2 W4 l6 t( V: s
} else if (month == 2) {
" A! [, `3 K. J/ D! C& P9 h    System.out.println("February");
9 D  k  m$ O! w+ V}$ H% ?7 m3 x2 E: B
...  // 等等
$ {8 w8 N5 h) |" ]4 [
) y9 J7 p* L- ]" L9 l8 r' D% t决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可
8 ~9 F- `% e4 r& L* s# W3 ~/ o$ J+ q( @5 d  d2 K& j0 [
以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。" I+ q9 X5 U/ O
另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语
* t! V# E# n& Q" A6 ?: S% t7 ?
' Q& n- ]8 o4 ?句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论
$ `9 B0 Z. Q, Q" J
( |4 n8 n8 F2 B* l( |8 Q: N/ P& K后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落7 x2 e! U' p1 T* D$ [0 Y" d' o

0 _/ u+ s& y9 S4 }空。该程序显示对应的整数月和月,按照年月:
7 q7 x9 }8 r" z6 X- ~1 kpublic class SwitchDemoFallThrough {, J6 k0 b% D% r+ n! R9 H

$ x- @4 n9 }5 ?2 u( U* D$ C& E( L    public static void main(String[] args) {
% O* W9 S( z# f* `/ T" a( ]4 ~' f        java.util.ArrayList<String> futureMonths =
, N" e" V/ r5 p7 @' x+ \            new java.util.ArrayList<String>();
! w- }6 F0 o0 j( H" J, ^; d
! ]6 p: c# r& E  G; Q        int month = 8;. Z) O" E/ r* E+ e
, o2 |: I$ Q" X2 N4 U, ]
        switch (month) {0 n7 Y% e7 E2 ~% Y2 d& l' n
            case 1:  futureMonths.add("January");
2 W# X5 t/ A; Z- Y0 U            case 2:  futureMonths.add("February");+ |1 D' Q/ ^8 e$ W4 v! [7 Y8 S
            case 3:  futureMonths.add("March");( p: K6 f7 s. v9 ~; p6 B+ E4 s
            case 4:  futureMonths.add("April");- d5 B4 {8 A) p  y
            case 5:  futureMonths.add("May");+ ~1 \6 F$ f0 c0 e0 X
            case 6:  futureMonths.add("June");
  K; \* @7 [2 j1 g            case 7:  futureMonths.add("July");
4 T( z, H. ^- X8 i7 W* e, X            case 8:  futureMonths.add("August");5 J) P$ ?" }5 Z; Z+ n& m# C
            case 9:  futureMonths.add("September");9 g" i* O% F  ^: `  z
            case 10: futureMonths.add("October");4 k4 H7 |: M+ n; V$ n5 \
            case 11: futureMonths.add("November");
! }5 ]' u" M6 f% L  B: k            case 12: futureMonths.add("December");
% K  ^) j2 q9 _8 \* K                     break;
, D( T, M/ L5 z, h            default: break;- }8 I% `. f/ ~" p3 j6 {
        }
" G* y/ P3 B1 O( v$ h) ]6 E: F) h# i" o: A* g
        if (futureMonths.isEmpty()) {
' ^7 B  N5 [- t# n. P4 w            System.out.println("Invalid month number");
) `. {) M  X' l        } else {
) A% i' z2 \& O. C+ d' b9 Z            for (String monthName : futureMonths) {( O, f4 Z6 i% z. x/ e
               System.out.println(monthName);
; k2 S& }/ I9 l# @; K6 j& Q+ w. c( x            }
3 w' b& B% i8 X- F" t        }
( G+ Z& }: J* T5 p' p: y    }
, S9 z5 @6 b; I# ^: J( y}
2 q6 w4 b' I6 E. h9 O* {这是从代码的输出:  Z0 ]! Z5 ^+ ~  W
  t9 G, ?6 B# I! k0 I: m- k3 {
August
% v  `& w* o/ [2 uSeptember/ {' p' n8 f% ^- `& N1 G
October
+ w8 B& D# s& a  `! ^. |( \/ tNovember
" X2 P$ Q9 K$ l, A/ MDecember8 r* j4 J8 H0 f  ?

7 P4 G4 D' x: T2 l2 t& _5 @6 ?. H从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不
6 J" u! f' q* J' R
/ q9 o- ]+ H# N. G容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。
# D/ G6 D9 H! z下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数# j  O) P6 t( ^' J
' O8 h8 B: x+ h3 W" a

# M1 U; e4 H# P+ nclass SwitchDemo2 {  y  v) D# G. ?7 r4 @
    public static void main(String[] args) {
+ V/ S& [* [! J6 ]! `% g- L. ^  K( e9 k( q) V+ L
        int month = 2;7 h: D% N0 ^& o2 }* d0 l7 F
        int year = 2000;( v7 w" P& ~+ ]+ s8 E
        int numDays = 0;8 N5 N4 H/ v/ Y

  I& q+ `6 I& S! n        switch (month) {4 M( N! _& `+ s# ]% _3 ~: d' w0 u
            case 1: case 3: case 5:6 g, Z. W" ?2 f+ K  B. q
            case 7: case 8: case 10:
& X- W" O6 J& t6 @            case 12:
7 D# Z$ d7 x5 X& F                numDays = 31;6 n* M( b; ^& B5 H. t
                break;
& B* |- h6 Y1 I) g9 j2 w            case 4: case 6:
9 k& ?5 @4 {; h* l" c% g. ~8 C            case 9: case 11:
5 Z# x* r- J8 Z                numDays = 30;
, [# F  I) L3 E9 u& f# {                break;; ^& x3 l, o8 R, l! W
            case 2:! G0 f9 x4 Y% F& |
                if (((year % 4 == 0) &&
- r% W. ?$ n0 L$ s' i5 ^7 }                     !(year % 100 == 0))/ `: Z  ~( S4 l' u( [$ L% l
                     || (year % 400 == 0))! p1 ]' M# Y2 t' t
                    numDays = 29;
, C* r7 z' S! p) P                else2 Y' C, F, a' \! \
                    numDays = 28;
7 c7 m" \& ~: y: F# l9 V$ N; l8 u                break;
$ U8 K+ I2 G9 r" w6 C            default:' G# }) A* @$ ]) ]5 d( \& I) M
                System.out.println("Invalid month.");
9 G( E+ d" A2 c7 t, O. ^6 N. u                break;# C. ?+ F& t6 X6 ?% g
        }) D, h% W2 p0 |6 P$ w3 p( @
        System.out.println("Number of Days = "" U" ]9 i3 s) @- s
                           + numDays);# y# _: r' `8 y+ ~& m/ k8 W
    }
  u% Q5 a* R1 R% _% W8 r. M}
$ O; {) H$ f' T" n+ }这是从代码的输出:2 k$ g( [/ W1 g1 I* x& c6 x
Number of Days = 29
8 u# n$ T8 y) F' E7 h$ A" Y% [$ e0 R- H% e3 Z, J
二、在switch语句中使用字符串" l; W% W$ \/ a% ]6 P. ?: y
在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,
7 Z5 l$ b  r$ \, L4 M# T: Z7 |( N
/ m; a# ~7 ~/ u' Estringswitchdemo,展示了基于字符串的值为月的月数:
7 q* R/ ^& [% A4 S3 g& y& K  N9 w8 C: r4 W
public class StringSwitchDemo {; |* c3 O$ g1 w. b6 w
% H" s+ w0 d. C# x- q
    public static int getMonthNumber(String month) {
. k% o7 \$ a& w2 I+ U9 T6 \1 }$ ]- d
        int monthNumber = 0;" p$ s) b3 i( \$ k2 c4 _# G

' S  [7 H% P+ A! L: i5 E        if (month == null) {" j! ]1 n6 w) M5 ~8 Y
            return monthNumber;: U' o+ j- t) q" I" I+ N# o
        }
) N3 y9 M9 ~' _. y: ?& D4 ^. _
' H( d6 Z. A* V2 B5 L( \        switch (month.toLowerCase()) {
2 L! t- b7 Y4 b* P4 ?6 Y+ C5 y6 h            case "january":  h9 i' Q- e+ g7 L& [# a: q( r
                monthNumber = 1;
' u1 c9 X- N2 p5 c2 ]  X5 A                break;2 A8 n8 o! x9 G8 T0 |
            case "february":
+ e! U( l# q( |) s                monthNumber = 2;
  G' X, Y3 s1 X/ X$ e! I; ~4 z1 `                break;% w; s* T: ~1 D
            case "march":4 {- O3 S8 k' J  O8 N( H6 h
                monthNumber = 3;
! Y/ p" c$ O0 e% a( @+ _                break;
! {, N1 t. s3 O: w1 A            case "april":
& Z3 O: G8 |& v                monthNumber = 4;: r3 o$ A% q: _( X  ^+ m$ ?
                break;
0 U) r# B% n* [) R; Y. u5 @7 F  N            case "may":* u  N; g+ o$ _2 e/ x- q. C; m
                monthNumber = 5;2 S) V% H- Q! F1 k
                break;
+ [9 E2 z6 W4 z% S. W            case "june":  i' g( r) s8 @) l
                monthNumber = 6;
" y  t9 E+ {2 H3 T# h- t* ~                break;; c+ p5 @# D' @) y6 {, `. O3 H
            case "july":
- O/ I& g+ m9 e# W6 o' V                monthNumber = 7;
8 E( F8 [/ ^: ?# [                break;
+ D) r4 f; K! m% A. n, M            case "august":( r/ z- G" F$ }6 t, G
                monthNumber = 8;- d5 i# a$ ]& N: v$ a
                break;
4 R6 P6 J' G5 R* D6 l0 m            case "september":
+ J8 y5 }) f8 w                monthNumber = 9;  V) k, e! P; O( y, |5 U
                break;
  M$ J3 c7 B" L/ H! g- k2 E6 F' }7 r; K            case "october":
3 y+ L! I2 ^8 b; d                monthNumber = 10;
3 x8 l+ J9 L# ]                break;
: P8 W* G  o  R5 Q( u. z2 Q            case "november":
% K7 m# o/ N, Z                monthNumber = 11;
. ~) w7 x$ w# U6 J4 c" u6 {4 k! _                break;& r0 X+ M# {7 E5 U* J
            case "december":* B, z+ t4 r9 p: Z+ v
                monthNumber = 12;3 T; Y0 b7 f; ^2 N! Y% f7 _6 @
                break;$ Q4 L* K+ V1 j* ?) {8 ]: F7 g
            default: / J1 ?( _' ~  d8 d: t( l# A7 }8 C* t
                monthNumber = 0;
& y! K! q" h% P  F                break;
) u. K! G; j( D4 T        }
6 n8 H- M( c$ Q
- E7 L6 P$ f6 g- d3 {7 I* h        return monthNumber;$ |) |/ B8 ]* ^  X: b# k5 Z
    }7 W0 n9 F/ @1 u' o* L; _( ~

: h1 D, h& S( N3 x4 X4 w    public static void main(String[] args) {
4 o! F0 O$ N$ L  p  `& |7 L6 [2 Y( F
& r" H& j- B4 s0 t* U  Q3 D        String month = "August";4 E! V5 E* r5 z4 r  `) ~6 a1 i

1 ~8 D) N; g3 l        int returnedMonthNumber =3 s; ?+ l# @5 {5 b& H
            StringSwitchDemo.getMonthNumber(month);
9 ^2 D, c7 J( }/ j0 r0 }9 k% t$ `# Y- D6 x
        if (returnedMonthNumber == 0) {% {- I  Y3 _# @# K; K. ]! z" B0 m
            System.out.println("Invalid month");
: T: V4 P9 V- Q" z# X        } else {* x% m* ?  U& m! Z( q0 q
            System.out.println(returnedMonthNumber);
7 |  f# ]" r3 L. F( Y, T9 C1 Z/ a        }
) j$ e; u1 q2 @, M3 I% `; M    }
, O" X# K+ ~6 H* _, U}
, H/ R, T" O) ^, g从这个代码的输出是 8.2 n, ^$ `' A2 c+ S7 {- `
switch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了8 a! P! |9 i: P) Q0 q' |2 r

" b! X) }7 g/ k" M) H3 y2 {) Zstringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符
8 S& T7 A$ `, I: H3 {/ z9 K$ L7 y' P4 _7 x# `
串小写标签。
& {1 _6 j' ?5 R( {注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个
! v% R* F& D7 D3 h
, t+ r* i' V* F% p# gNullPointerException异常被抛出。( d1 P6 i3 V( G% x
本文转载于toceansoft.com
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

GMT+8, 2025-5-20 19:43

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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