|
一、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 |
|