java 之 枚舉
看了點黑馬的視頻,邊看邊試驗,結合自己的理解,動手試試。
在這個示例中,將會學到內部類、枚舉、接口等等
import java.util.Random;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Fire.M4A1);
System.out.println(Fire.RPG);
System.out.println(Fire.MP5);
System.out.println(Fire.SCAR);
System.out.println("----------------------");
System.out.println(Fire.M4A1.fire());
System.out.println(Fire.RPG.fire());
System.out.println(Fire.MP5.fire());
System.out.println(Fire.SCAR.fire());
System.out.println("----------------------");
System.out.println(Fire.M4A1.getWeapon());
System.out.println(Fire.RPG.getWeapon());
System.out.println(Fire.MP5.getWeapon());
System.out.println(Fire.SCAR.getWeapon());
}
// 設置開火的聲音
public String setFireSound(String sound) {
String f = "..";
String a = "";
Random r = new Random(); // 種子隨便
int count = r.nextInt(10); // 獲取一個10以內的隨即整數
for (int i = 0; i <= count; i++) {
if (r.nextBoolean()) { // 隨機boolean值,如果為真,weapon is broken,卡殼了
a += "咔" + f;
} else {
a += sound + f;
}
}
return a;
}
// 這是個接口,<武器>接口
public interface Weapon {
public abstract String fire(); // 開火的接口
};
public enum Fire implements Weapon {
/*
* enum類只能實現接口,而沒法繼承。每個枚舉,而有相當于enum的子類
* 枚舉后面的花括號,就相當于類的構造體,里面所實現的方法,可以是重載等等
*/
M4A1 {
@Override
public String fire() {
// 既然這個枚舉類實現了武器接口,就必須實現它的方法
String name = Fire.values()[0].toString();
String fire = (new Test()).setFireSound("噠");
return name + " fire-->" + fire;
}
},
SCAR {
@Override
public String fire() {
// 既然這個枚舉類實現了武器接口,就必須實現它的方法
String name = Fire.values()[1].toString();
String fire = (new Test()).setFireSound("嗒");
return name + " fire-->" + fire;
}
},
MP5 {
@Override
public String fire() {
// 既然這個枚舉類實現了武器接口,就必須實現它的方法
String name = Fire.values()[2].toString();
String fire = (new Test()).setFireSound("咻");
return name + " fire-->" + fire;
}
},
RPG {
@Override
public String fire() {
// 既然這個枚舉類實現了武器接口,就必須實現它的方法
String name = Fire.values()[3].toString();
String fire = (new Test()).setFireSound("嘭");
return name + " fire-->" + fire;
}
};
/*
* 枚舉的內部方法,每個枚舉都會擁有此方法,而每個枚舉成員又都可以重載或覆蓋此方法
*/
public String getWeapon() {
// this關鍵字,即當前的枚舉
return this.name() + " weapon";
}
}
}
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Fire.M4A1);
System.out.println(Fire.RPG);
System.out.println(Fire.MP5);
System.out.println(Fire.SCAR);
System.out.println("----------------------");
System.out.println(Fire.M4A1.fire());
System.out.println(Fire.RPG.fire());
System.out.println(Fire.MP5.fire());
System.out.println(Fire.SCAR.fire());
System.out.println("----------------------");
System.out.println(Fire.M4A1.getWeapon());
System.out.println(Fire.RPG.getWeapon());
System.out.println(Fire.MP5.getWeapon());
System.out.println(Fire.SCAR.getWeapon());
}
// 設置開火的聲音
public String setFireSound(String sound) {
String f = "..";
String a = "";
Random r = new Random(); // 種子隨便
int count = r.nextInt(10); // 獲取一個10以內的隨即整數
for (int i = 0; i <= count; i++) {
if (r.nextBoolean()) { // 隨機boolean值,如果為真,weapon is broken,卡殼了
a += "咔" + f;
} else {
a += sound + f;
}
}
return a;
}
// 這是個接口,<武器>接口
public interface Weapon {
public abstract String fire(); // 開火的接口
};
public enum Fire implements Weapon {
/*
* enum類只能實現接口,而沒法繼承。每個枚舉,而有相當于enum的子類
* 枚舉后面的花括號,就相當于類的構造體,里面所實現的方法,可以是重載等等
*/
M4A1 {
@Override
public String fire() {
// 既然這個枚舉類實現了武器接口,就必須實現它的方法
String name = Fire.values()[0].toString();
String fire = (new Test()).setFireSound("噠");
return name + " fire-->" + fire;
}
},
SCAR {
@Override
public String fire() {
// 既然這個枚舉類實現了武器接口,就必須實現它的方法
String name = Fire.values()[1].toString();
String fire = (new Test()).setFireSound("嗒");
return name + " fire-->" + fire;
}
},
MP5 {
@Override
public String fire() {
// 既然這個枚舉類實現了武器接口,就必須實現它的方法
String name = Fire.values()[2].toString();
String fire = (new Test()).setFireSound("咻");
return name + " fire-->" + fire;
}
},
RPG {
@Override
public String fire() {
// 既然這個枚舉類實現了武器接口,就必須實現它的方法
String name = Fire.values()[3].toString();
String fire = (new Test()).setFireSound("嘭");
return name + " fire-->" + fire;
}
};
/*
* 枚舉的內部方法,每個枚舉都會擁有此方法,而每個枚舉成員又都可以重載或覆蓋此方法
*/
public String getWeapon() {
// this關鍵字,即當前的枚舉
return this.name() + " weapon";
}
}
}
輸出:
M4A1
RPG
MP5S
CAR
----------------------
M4A1 fire-->咔..咔..咔..噠..咔..
RPG fire-->咔..嘭..咔..嘭..咔..嘭..嘭..嘭..嘭..嘭..
MP5 fire-->咻..咻..咔..咔..咔..
SCAR fire-->嗒..咔..嗒..嗒..嗒..
----------------------
M4A1 weapon
RPG weapon
MP5 weapon
RPG
MP5S
CAR
----------------------
M4A1 fire-->咔..咔..咔..噠..咔..
RPG fire-->咔..嘭..咔..嘭..咔..嘭..嘭..嘭..嘭..嘭..
MP5 fire-->咻..咻..咔..咔..咔..
SCAR fire-->嗒..咔..嗒..嗒..嗒..
----------------------
M4A1 weapon
RPG weapon
MP5 weapon
SCAR weapon
起初接觸枚舉是c#,轉到java后一直沒有關注過1.5及以后版本的新增特性,看了《thingking in java》結合視頻,才發現java的靈活之處,一個枚舉都異常靈活強大。
使用了enum關鍵字,即繼承Enum類,所以enum只能實現接口,而不能多重繼承了。
在枚舉成員中,每個枚舉成員可以看作一個對象,又像枚舉的靜態繼承類,相當于枚舉成員繼承了這個枚舉,從而可以擴展方法,加上花括號就行,內部怎么寫東西,就像對待一般內部類一樣。
浙公網安備 33010602011771號