目錄:
1.常規語法
2.正確案例分析
3.錯誤案例分析
1.常規語法
1.1.switch參數范圍
switch(A),括號中A的取值可以是byte、short、int、char、String,還有枚舉類型,應用舉例:
//(1)byte
byte baction=2;
switch (baction)
{
case 1:System.out.print(baction);break;
case 2:System.out.print(baction);break;
}
//(2)short
short saction=3;
switch (saction)
{
case 1:System.out.print(saction);break;
case 3:System.out.print(saction);break;
}
//(3)int
int iaction=4;
switch (iaction)
{
case 1:System.out.print(iaction);break;
case 4:System.out.print(iaction);break;
}
//(4)char
char caction='a';
switch (caction)
{
case 1:System.out.print(caction);break;
case 'a':System.out.print(caction);break;
}
//(5)String
String straction="abc";
switch (straction)
{
case "1":System.out.print(straction);break;
case "abc":System.out.print(straction);break;
}
//(6)枚舉
String fullStr="00000000000000";
CompletedProgressEnum action=CompletedProgressEnum.basic;
StringBuilder sb = new StringBuilder(fullStr);
switch (action)
{
case basic:sb.replace(0, 2,CompletedProgressEnum.basic.getValue()); break;
case edu:sb.replace(2, 4,CompletedProgressEnum.edu.getValue());break;
}
注意:long類型不能作為switch參數。
1.2.case子句
case B;case是常量表達式,也就是說B的取值只能是常量(需要定義一個final型的常量)或者int、byte、short、char(比如1、2、3、200000000000(注意了這是整型))。
如果沒有符合的case,就執行default,default為非必選項。
二.正確案例分析:
1.標准型(case后面都有break語句,case后的值都是整數)
int i=3;
switch(i)
{
case 1:
System.out.println(1);
break;
case 2:
System.out.println(2);
break;
default:
System.out.println("default");
break;
}
2.常量型(case后面都有break語句,case后的值都是常量)
private final int NUM1=1;
private final int NUM2=1;
int i=3;
switch(i)
{
case NUM1:
private final int NUM2=1;
int i=3;
switch(i)
{
case NUM1:
System.out.println(1);
break;
case NUM2:
System.out.println(2);
break;
default:
System.out.println("default");
break;
}
三.錯誤案例分析:
1.第二種情況容易出錯的情況:
發現問題
private int CLICK_QUERY = 1;
private int CLICK_RESET = 2;
@Override
public void onClick(View v)
{
int tag = (Integer) v.getTag();
switch (tag)
{
case CLICK_QUERY:
query();
break;
case CLICK_RESET:
reset();
break;
}
}
編譯時一直報錯:CLICK_QUERY 和CLICK_RESET——case expressions must be constant expressions
解決問題:
case后面必須跟常量,必須要常量,將上面兩個變量聲明為final即可。
private final int CLICK_QUERY = 1;
private final int CLICK_RESET = 2;
2.下面是switch的簡單寫法:
switch(A){
case B;
}
final型的變量也是有要求的,也即是它必須是編譯時的常量,怎么講呢,看下面的程序段:
final int a = 0;
final int b;
第二個語句就是在編譯時不能夠被識別出值的變量,因為它沒有初始化,當然,這條語句也是錯誤的。所以總結case后的值可以是常數值或final型的值。再看下面的程序段:
byte a = 11;
switch(a){// C
case 11 : System.out.println(" 11 "); break;
case 225 : System.out.println(" 11 "); break;// D
}
該代碼正確嗎?答案是否定的。雖然在 C 處是合法的也即是byte型的a值可以出現在switch中,但是 D處的語句也即是第二個case后的值是225大小超過了byte的范圍,所以是錯誤的。再就是case后的值不能出現重復。因此在使用中要注意。
3.忘記寫break的錯誤
再就是在使用switch-case中最容易忽視的就是忘記在每個case后處理完后忘記寫上break;語句。那它帶來的后果是什么呢,下面小程序段會告訴你:
byte a = 2;
switch(a){
case 1 : System.out.println(" A ");
case 2 : System.out.println(" B ");
case 3 : System.out.println(" C ");
case 4 : System.out.println(" D ");
default : System.out.println(" default ");
}
=========輸出結果為:
B
C
D
default
--------------------------
下面是突然想到的問題,有高人能精確地說明白嗎?
※java int、byte、short、char 數據類型的范圍,是怎么算出來的,32位或64位的系統對數據類型范圍有影響嗎,32位系統或64位系統指的是什么?
※java int、byte、short、char 與32位系統,64位系統有關嗎?
※ int、byte、short、char在內存中是怎么存儲的?