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只能实现接口,而不能多重继承了。
在枚举成员中,每个枚举成员可以看作一个对象,又像枚举的静态继承类,相当于枚举成员继承了这个枚举,从而可以扩展方法,加上花括号就行,内部怎么写东西,就像对待一般内部类一样。