枚举概述
•是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。举例:一周只有7天,一年只有12个月等。
•回想单例设计模式:单例类是一个类只有一个实例
•那么多例类就是一个类有多个实例,但不是无限个数的实例,而是有限个数的实例。这才能是枚举类。
定义枚举类:方向
版本一:
public class Direction {
//创建实例
public static final Direction FRANT = new Direction();
public static final Direction BACKHIND = new Direction();
public static final Direction LEFT = new Direction();
public static final Direction RIGHT = new Direction();
//构造私有禁止创建
private Direction() {
}
}
调用:
public class TEST {
public static void main(String[] args) {
// TODO Auto-generated method stub
//私有不可创建
//Direction d = new Direction(); //public static final Direction FRANT = new Direction();
Direction d = Direction.FRANT;
System.out.println(d);
}
}
//输出
juli.Direction@7852e922
版本二:
public class Direction {
//创建实例
public static final Direction FRANT = new Direction("前");
public static final Direction BACKHIND = new Direction("后");
public static final Direction LEFT = new Direction("左");
public static final Direction RIGHT = new Direction("右");
//构造私有禁止创建
/* private Direction() {
}*/
//加入成员变量并去掉无参构造
private String name;
private Direction(String s) {
this.name = s;
}
public String getname() {
return name;
}
}
public class TEST {
public static void main(String[] args) {
// TODO Auto-generated method stub
//私有不可创建
//Direction d = new Direction(); //public static final Direction FRANT = new Direction();
Direction d = Direction.FRANT;
System.out.println(d);
System.out.println(d.getname());
}
}
//输出
juli.Direction@7852e922
前
版本三
package juli;
public abstract class Direction {
//创建实例
//创协该类的抽象方法
public static final Direction FRANT = new Direction("前") {
@Override
public
void run() {
// TODO Auto-generated method stub
System.out.println("frant");
}};
public static final Direction BACKHIND = new Direction("后") {
@Override
public
void run() {
// TODO Auto-generated method stub
System.out.println("backhand");
}};
public static final Direction LEFT = new Direction("左") {
@Override
public
void run() {
// TODO Auto-generated method stub
System.out.println("left");
}
};
public static final Direction RIGHT = new Direction("右") {
@Override
public
void run() {
// TODO Auto-generated method stub
System.out.println("right");
}};
//构造私有禁止创建
/* private Direction() {
}*/
//加入成员变量并去掉无参构造
private String name;
private Direction(String s) {
this.name = s;
}
public String getname() {
return name;
}
//加入抽象方法
public abstract void run();
}
public class TEST {
public static void main(String[] args) {
// TODO Auto-generated method stub
//私有不可创建
//Direction d = new Direction(); //public static final Direction FRANT = new Direction();
Direction d = Direction.FRANT;
System.out.println(d);
System.out.println(d.getname());
d.run();
}
}
使用jdk自带的枚举类:
注意事项
•定义枚举类要用关键字enum
•所有枚举类都是Enum的子类
•枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略
•枚举类可以有构造器,但必须是private的,它默认的也是private的。枚举项的用法比较特殊:枚举(“”);
•枚举类也可以有抽象方法,但是枚举项必须重写该方法
•枚举在switch语句中的使用
版本一:
package juli;
/*通过jdk积功德枚举来做枚举类*/
public enum Direct {
FRONT,BEHIND,LEFT,RIGHT;
}
调用:
public class TEST {
public static void main(String[] args) {
// TODO Auto-generated method stub
Direct d = Direct.FRONT;
System.out.println(d);
}
}
版本二:
package juli;
/*通过jdk积功德枚举来做枚举类*/
public enum Direct {
FRONT("前"),BEHIND("后"),LEFT("左"),RIGHT("右");
private String name = null;
private Direct(String name) {
this.name=name;
}
public String getstring() {
return name;
}
}
public class TEST {
public static void main(String[] args) {
// TODO Auto-generated method stub
Direct d = Direct.FRONT;
System.out.println(d);
System.out.println(d.getstring());
}
}
//结果
FRONT
前
第三版:
package juli;
/*通过jdk积功德枚举来做枚举类*/
public enum Direct {
FRONT("前"){
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("前");
}},
BEHIND("后"){
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("后");
}},
LEFT("左"){
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("左");
}},
RIGHT("右"){
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("右");
}};
private String name = null;
private Direct(String name) {
this.name=name;
}
public String getstring() {
return name;
}
public abstract void show();
}
public class TEST {
public static void main(String[] args) {
// TODO Auto-generated method stub
Direct d = Direct.FRONT;
System.out.println(d);
System.out.println(d.getstring());
d.show();
}
}
public class TEST {
public static void main(String[] args) {
// TODO Auto-generated method stub
Direct d = Direct.FRONT;
/*System.out.println(d);
System.out.println(d.getstring());
d.show();*/
switch (d) {
case FRONT:
System.out.println("你选择了前");
break;
case BEHIND:
System.out.println("你选择了后");
break;
case LEFT:
System.out.println("你选择了左");
break;
case RIGHT:
System.out.println("你选择了右");
break;
}
}
}
public class TEST {
public static void main(String[] args) {
//int compareTo(E o)
//做比较
Direct d1 = Direct.FRONT;
Direct d2 = Direct.BEHIND;
Direct d3 = Direct.LEFT;
Direct d4 = Direct.RIGHT;
System.out.println(d1.compareTo(d1));
System.out.println(d1.compareTo(d4));
System.out.println(d4.compareTo(d1));
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");
//String name()
System.out.println(d1.name());
System.out.println(d2.name());
System.out.println(d3.name());
System.out.println(d4.name());
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");
//int ordinal()
System.out.println(d1.ordinal());
System.out.println(d2.ordinal());
System.out.println(d3.ordinal());
System.out.println(d4.ordinal());
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");
//String toString()
System.out.println(d1.toString());
System.out.println(d2.toString());
System.out.println(d3.toString());
System.out.println(d4.toString());
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");
//<T> T valueOf(Class<T> type,String name)
//Direct dd = Enum.valueOf(Direct.class, "FRANT");
//System.out.println(dd.getstring());
//System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");
//values() 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便
Direct[] dirs = Direct.values();
for (Direct dir:dirs) {
System.out.println(dir);
}
}
}
//输出
0
-3
3
~~~~~~~~~~~~~~~~~~~~~~~
FRONT
BEHIND
LEFT
RIGHT
~~~~~~~~~~~~~~~~~~~~~~~
0
1
2
3
~~~~~~~~~~~~~~~~~~~~~~~
FRONT
BEHIND
LEFT
RIGHT
~~~~~~~~~~~~~~~~~~~~~~~
FRONT
BEHIND
LEFT
RIGHT