枚舉類型的定義和枚舉變量的說明
1. 枚舉的定義枚舉類型定義的一般形式為:
enum 枚舉名{ 枚舉值表 };
在枚舉值表中應(yīng)羅列出所有可用值。這些值也稱為枚舉元素。
例如:
該枚舉名為weekday,枚舉值共有7個,即一周中的七天。凡被說明為weekday類型變量的取值只能是七天中的某一天。
2. 枚舉變量的說明
如同結(jié)構(gòu)和聯(lián)合一樣,枚舉變量也可用不同的方式說明,即先定義后說明,同時定義說明或直接說明。
設(shè)有變量a,b,c被說明為上述的weekday,可采用下述任一種方式:
enum weekday{ sun,mon,tue,wed,thu,fri,sat };
enum weekday a,b,c;
或者為:
enum weekday{ sun,mon,tue,wed,thu,fri,sat }a,b,c;
或者為:
enum { sun,mon,tue,wed,thu,fri,sat }a,b,c;
枚舉類型變量的賦值和使用
枚舉類型在使用中有以下規(guī)定:
1. 枚舉值是常量,不是變量。不能在程序中用賦值語句再對它賦值。
例如對枚舉weekday的元素再作以下賦值:
sun=5;
mon=2;
sun=mon;
都是錯誤的。
2. 枚舉元素本身由系統(tǒng)定義了一個表示序號的數(shù)值,從0開始順序定義為0,1,2…。如在weekday中,sun值為0,mon值為1,…,sat值為6。
【例11.10】
main(){
enum weekday
{ sun,mon,tue,wed,thu,fri,sat } a,b,c;
a=sun;
b=mon;
c=tue;
printf("%d,%d,%d",a,b,c);
}
說明:
只能把枚舉值賦予枚舉變量,不能把元素的數(shù)值直接賦予枚舉變量。如:
a=sun;
b=mon;
是正確的。而:
a=0;
b=1;
是錯誤的。如一定要把數(shù)值賦予枚舉變量,則必須用強制類型轉(zhuǎn)換。
如:
a=(enum weekday)2;
其意義是將順序號為2的枚舉元素賦予枚舉變量a,相當(dāng)于:
a=tue;
還應(yīng)該說明的是枚舉元素不是字符常量也不是字符串常量,使用時不要加單、雙引號。
【例11.11】
#include <stdio.h>
int main(){
enum body
{ a,b,c,d } month[31],j;
int i1;
j=a;
for(i1=1;i1<=30;i1++){
month[i1]=j;
j++;
if (j>d) j=a;
}
for(i1=1;i1<=30;i1++){
switch(month)
{
case a:printf(" %2d %c\t",i1,'a'); break;
case b:printf(" %2d %c\t",i1,'b'); break;
case c:printf(" %2d %c\t",i1,'c'); break;
case d:printf(" %2d %c\t",i1,'d'); break;
default:break;
}
}
printf("\n");
}
Enum的用法
Enum是enumeration(列舉)的簡寫形式,包含在java.lang包中.熟悉C, C++, C#, 或 Pascal人應(yīng)該對列舉有所了解,先看個例子: public enum Season { winter, spring, summer, fall }
一個enum是定義一組值的對象,它可以包括零個或多個值成員.它是屬于enum類型的,一個enum對象中不可有兩個或多個相同的屬性或值.在次之前的java程序員一般是 用接口的方法實現(xiàn)列舉的,如 :
public interface Season {
static winter = 0;
static spring = 1; //etc..
}
引入了enum的java的列舉的編寫方便了許多,只須定義一個enum型的對象.enum對象的值都回自動獲得一個數(shù)字值,從0開始,依次遞增.看一個比較簡單的enum實現(xiàn)的例子:
EnumDemo.java
package net.javagarage.enums;
/*
We can loop over the values we put into the enum
using the values() method.
Note that the enum Seasons is compiled into a
separate unit, called EnumDemo$Seasons.class
*/
public class EnumDemo {
/*declare the enum and add values to it. note that, like in C#, we don't use a ; to
end this statement and we use commas to separate the values */
private enum Seasons { winter, spring,
summer, fall }
//list the values
public static void main(String[] args) {
for (Seasons s : Seasons.values()){
System.out.println(s);
}
}
}
運行上述代碼你回得到 以下結(jié)果:
winter
spring
summer
fall
Enum的屬性調(diào)用:
下面的代碼展示了調(diào)用enum對象的方法,這也是它通常的用法:
package net.javagarage.enums;
/*
File: EnumSwitch.java
Purpose: show how to switch against the values in an enum.
*/
public class EnumSwitch {
private enum Color { red, blue, green }
//list the values
public static void main(String[] args) {
//refer to the qualified value
doIt(Color.red);
}
/*note that you switch against the UNQUALIFIED name. that is, "case Color.red:" is a
compiler error */
private static void doIt(Color c){
switch (c) {
case red:
System.out.println("value is " + Color.red);
break;
case green:
System.out.println("value is " + Color.green);
break;
case blue:
System.out.println("value is : " + Color.blue);
break;
default :
System.out.println("default");
}
}
}
為enums添加屬性和方法
enums也可以象一般的類一樣添加方法和屬性,你可以為它添加靜態(tài)和非靜態(tài)的屬性或方法,這一切都象你在一般的類中做的那樣.
package net.javagarage.enums;
/*
File: EnumDemo.java
Purpose: show how to use an enum that also defines its own fields and methods
*/
public class EnumWithMethods {
//declare the enum and add values to it.
public enum Season {
winter, spring, summer, fall;
private final static String location = "Phoenix";
public static Season getBest(){
if (location.equals("Phoenix"))
return winter;
else
return summer;
}
public static void main(String[] args) {
System.out.println(Season.getBest());
}
}
就是這么的簡單.但是有一點是需要注意的,那就是enums的值列表必須緊跟在enum聲明,不然編譯時將會出錯.
Enums構(gòu)造函數(shù):
和類一樣enums也可以有自己的構(gòu)造函數(shù),如下:
package net.javagarage.enums;
public class EnumConstructor {
public static void main(String[] a) {
//call our enum using the values method
for (Temp t : Temp.values())
System.out.println(t + " is : " + t.getValue());
}
//make the enum
public enum Temp {
absoluteZero(-459), freezing(32),
boiling(212), paperBurns(451);
//constructor here
Temp(int value) {
this.value = value;
}
//regular field?but make it final,
//since that is the point, to make constants
private final int value;
//regular get method
public int getValue() {
return value;
}
}
}
輸出結(jié)果是:
absoluteZero is : -459
freezing is : 32
boiling is : 212
paperBurns is : 451
盡管enums有這么多的屬性,但并不是用的越多越好,如果那樣還不如直接用類來的直接.enums的優(yōu)勢在定義int最終變量僅當(dāng)這些值有一定特殊含義時.但是如果你需要的是一個類,就定義一個類,而不是enum.