本文目錄一覽:
- 1、java,求高手講解一下一個枚舉的例子
- 2、java中的枚舉類型指的是什麼啊?
- 3、java 枚舉數組的問題
- 4、Java中如何將字符枚舉類變成一個數組
- 5、JAVA枚舉類定義的語法格式不明白
- 6、java里枚舉類型用於返回一個數組的方法values()在哪個裡啊?
java,求高手講解一下一個枚舉的例子
結果:Mr. John Doe
轉的。枚舉是一個特殊的類。
枚舉類型是JDK5.0的新特徵 。Sun引進了一個全新的關鍵字enum來定義一個枚舉類 。下面就是一個典型枚舉類型的定義:
Java代碼:
public enum Color{
RED,BLUE,BLACK,YELLOW,GREEN
}
顯然,enum很像特殊的class,實際上enum聲明定義的類型就是一個類 。 而這些類都是類庫中Enum類的子類(java.lang.Enum) 。它們繼承了這個Enum中的許多有用的方法 。我們對代碼編譯之後發現,編譯器將enum類型單獨編譯成了一個位元組碼文件:Color.class 。
Color位元組碼代碼
final enum hr.test.Color {
// 所有的枚舉值都是類靜態常量
public static final enum hr.test.Color RED;
public static final enum hr.test.Color BLUE;
public static final enum hr.test.Color BLACK;
public static final enum hr.test.Color YELLOW;
public static final enum hr.test.Color GREEN;
private static final synthetic hr.test.Color〔〕 ENUM$VALUES;
// 初始化過程,對枚舉類的所有枚舉值對象進行第一次初始化
static {
0 new hr.test.Color 〔1〕
3 dup
4 ldc 〔16〕 //把枚舉值字符串「RED」壓入操作數棧
6 iconst_0 // 把整型值0壓入操作數棧
7 invokespecial hr.test.Color(java.lang.String, int) 〔17〕 //調用Color類的私有構造器創建Color對象RED
10 putstatic hr.test.Color.RED : hr.test.Color 〔21〕 //將枚舉對象賦給Color的靜態常量RED 。
。.. 。.. 。.. 枚舉對象BLUE等與上同
102 return
};
// 私有構造器,外部不可能動態創建一個枚舉類對象(也就是不可能動態創建一個枚舉值) 。
private Color(java.lang.String arg0, int arg1){
// 調用父類Enum的受保護構造器創建一個枚舉對象
3 invokespecial java.lang.Enum(java.lang.String, int) 〔38〕
};
public static hr.test.Color〔〕 values();
// 實現Enum類的抽象方法
public static hr.test.Color valueOf(java.lang.String arg0);
}
下面我們就詳細介紹enum定義的枚舉類的特徵及其用法 。(後面均用Color舉例)
1、Color枚舉類就是class,而且是一個不可以被繼承的final類 。
其枚舉值(RED,BLUE. 。.)都是Color類型的類靜態常量, 我們可以通過下面的方式來得到Color枚舉類的一個實例:
Color c=Color.RED;
注意:這些枚舉值都是public static final的,也就是我們經常所定義的常量方式,因此枚舉類中的枚舉值最好全部大寫 。
2、即然枚舉類是class,當然在枚舉類型中有構造器,方法和數據域 。
但是,枚舉類的構造器有很大的不同:
(1) 構造器只是在構造枚舉值的時候被調用 。
Java代碼:
enum Color{
RED(255,0,0),BLUE(0,0,255),BLACK(0,0,0),YELLOW(255,255,0),GREEN(0,255,0);
//構造枚舉值,比如RED(255,0,0)
private Color(int rv,int gv,int bv){
this.redValue=rv;
this.greenValue=gv;
this.blueValue=bv;
}
public String toString(){ //覆蓋了父類Enum的toString()
return super.toString()+「(」+redValue+「,」+greenValue+「,」+blueValue+「)」;
}
private int redValue; //自定義數據域,private為了封裝 。
private int greenValue;
private int blueValue;
}
(2) 構造器只能私有private,絕對不允許有public構造器 。 這樣可以保證外部代碼無法新構造枚舉類的實例 。這也是完全符合情理的,因為我們知道枚舉值是public static final的常量而已 。 但枚舉類的方法和數據域可以允許外部訪問 。
Java代碼:
public static void main(String args〔〕)
{
// Color colors=new Color(100,200,300); //wrong
Color color=Color.RED;
System.out.println(color); // 調用了toString()方法
}
3、所有枚舉類都繼承了Enum的方法,下面我們詳細介紹這些方法 。
(1) ordinal()方法: 返回枚舉值在枚舉類種的順序 。這個順序根據枚舉值聲明的順序而定 。
Color.RED.ordinal(); //返回結果:0
Color.BLUE.ordinal(); //返回結果:1
(2) compareTo()方法: Enum實現了java.lang.Comparable接口,因此可以比較象與指定對象的順序 。Enum中的compareTo返回的是兩個枚舉值的順序之差 。當然,前提是兩個枚舉值必須屬於同一個枚舉類,否則會拋出ClassCastException()異常 。(具體可見源代碼)
Color.RED.compareTo(Color.BLUE); //返回結果 -1
(3) values()方法: 靜態方法,返回一個包含全部枚舉值的數組 。
Color〔〕 colors=Color.values();
for(Color c:colors){
System.out.print(c+「,」);
}//返回結果:RED,BLUE,BLACK YELLOW,GREEN,
(4) toString()方法: 返回枚舉常量的名稱 。
Color c=Color.RED;
System.out.println(c);//返回結果: RED
(5) valueOf()方法: 這個方法和toString方法是相對應的,返回帶指定名稱的指定枚舉類型的枚舉常量 。
Color.valueOf(「BLUE」); //返回結果: Color.BLUE
(6) equals()方法: 比較兩個枚舉類對象的引用 。
Java代碼:
//JDK源代碼:
public final boolean equals(Object other) {
return this==other;
}
4、枚舉類可以在switch語句中使用 。
Java代碼:
Color color=Color.RED;
switch(color){
case RED: System.out.println(「it『s red」);break;
case BLUE: System.out.println(「it』s blue」);break;
case BLACK: System.out.println(「it『s blue」);break;
}
java中的枚舉類型指的是什麼啊?
枚舉你就把他看做一個在list這堆數據裏面找出想要數據的一隻手,通常枚舉的實例都從list這個類裏面來實例,其作用說白了就是用來循環這個list(通常的使用目的),list裏面存放的是一個類。所以用枚舉而不是用像數組一樣的數字下標
java 枚舉數組的問題
枚舉enum是關鍵字,和private、public等一樣是關鍵字,不是enum類,
對於關鍵字,api沒有列出其介紹。
enum Color{//枚舉常量
red,green,black
}
Color colors[]=Color.values();
Java中如何將字符枚舉類變成一個數組
要變成怎樣的數組,是枚舉數組、還是將枚舉的各值變成數組 。。。。。。
JAVA枚舉類定義的語法格式不明白
枚舉的構造方法必須是私有的 所以不可以new對象
要想有對象必須在他的內部實例化,用你這個例子來說吧
enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE};
就相當於new出N個Size對象 名分別為SMALL …..而且是靜態的(不要問為什麼,這是enum的特點)
而這個枚舉類(看成特殊的類)的構造方法 需要穿進去一個String 所以new Size時需要傳參數
在哪傳呢? 就是這:SMALL(“S”)
所以 你說「但是Size.SMALL 既不是Size類的屬性也不是方法 我知道class和enum 是兩個類
」
其實 SMALL 是Size的靜態屬性 類型是 Size
明白了吧
java里枚舉類型用於返回一個數組的方法values()在哪個裡啊?
用法一:常量
在JDK1.5 之前,我們定義常量都是: publicstaticfianl…. 。現在好了,有了枚舉,可以把相關的常量分組到一個枚舉類型里,而且枚舉提供了比常量更多的方法。
Java代碼
public enum Color {
RED, GREEN, BLANK, YELLOW
}
用法二:switch
JDK1.6之前的switch語句只支持int,char,enum類型,使用枚舉,能讓我們的代碼可讀性更強。
Java代碼
enum Signal {
GREEN, YELLOW, RED
}
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {
case RED:
color = Signal.GREEN;
break;
case YELLOW:
color = Signal.RED;
break;
case GREEN:
color = Signal.YELLOW;
break;
}
}
}
用法三:向枚舉中添加新方法
如果打算自定義自己的方法,那麼必須在enum實例序列的最後添加一個分號。而且 Java 要求必須先定義 enum 實例。
Java代碼
public enum Color {
RED(“紅色”, 1), GREEN(“綠色”, 2), BLANK(“白色”, 3), YELLO(“黃色”, 4);
// 成員變量
private String name;
private int index;
// 構造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
// 普通方法
public static String getName(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
return c.name;
}
}
return null;
}
// get set 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
用法四:覆蓋枚舉的方法
下面給出一個toString()方法覆蓋的例子。
Java代碼
public enum Color {
RED(“紅色”, 1), GREEN(“綠色”, 2), BLANK(“白色”, 3), YELLO(“黃色”, 4);
// 成員變量
private String name;
private int index;
// 構造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//覆蓋方法
@Override
public String toString() {
return this.index+”_”+this.name;
}
}
用法五:實現接口
所有的枚舉都繼承自java.lang.Enum類。由於Java 不支持多繼承,所以枚舉對象不能再繼承其他類。
Java代碼
public interface Behaviour {
void print();
String getInfo();
}
public enum Color implements Behaviour{
RED(“紅色”, 1), GREEN(“綠色”, 2), BLANK(“白色”, 3), YELLO(“黃色”, 4);
// 成員變量
private String name;
private int index;
// 構造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//接口方法
@Override
public String getInfo() {
return this.name;
}
//接口方法
@Override
public void print() {
System.out.println(this.index+”:”+this.name);
}
}
用法六:使用接口組織枚舉
Java代碼
public interface Food {
enum Coffee implements Food{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
}
enum Dessert implements Food{
FRUIT, CAKE, GELATO
}
}
用法七:關於枚舉集合的使用
java.util.EnumSet和java.util.EnumMap是兩個枚舉集合。EnumSet保證集合中的元素不重複;EnumMap中的 key是enum類型,而value則可以是任意類型。關於這個兩個集合的使用就不在這裡贅述,可以參考JDK文檔。
關於枚舉的實現細節和原理請參考:
參考資料:《ThinkingInJava》第四版
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/244982.html