一. 使用自定义方法实现枚举 :
1. 在自定义的枚举类中把构造方法私有化 , 这样做是为了不能通过构造方法去创建对象 , 只能使用本类中已经创建好的对象 ;
2. 不提供set方法, 因为枚举对象值通常为只读 ;
3. 在自定义的类中创建的对象通常使用static final来修饰 , 用static可以通过类名直接访问此对象, 用final是为了避免static静态属性初始化造成的类加载static代码块 , 所以将static和final搭配使用 ;
public class Enum {
public static void main(String[] args) {
//输出自定义的四个对象
System.out.println(Season.spring);
System.out.println(Season.summer);
System.out.println(Season.autumn);
System.out.println(Season.winter);
}
}
//自定义枚举实现
class Season
{
private String name;
private String desc;
//(优化) 由于加上static会造成类加载,所以可以加上final避免:
public static final Season spring=new Season("春天","温暖");
public static final Season summer=new Season("夏天","炎热");
public static final Season autumn=new Season("秋天","凉爽");
public static final Season winter=new Season("冬天","寒冷");
//私有化构造方法,这样可以避免通过构造方法自己创建对象
private Season(String name,String desc)
{
this.name=name;
this.desc=desc;
}
//自定义枚举避免更改对象属性值,去除set方法,只有get方法变为只读模式
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
二. 使用enum关键字实现枚举类 :
1. 但使用enum关键字实现一个枚举类的时侯 , 默认会继承Enum类 , 而且enum这个类是一个final类 , 所以它不可以有子类;
2. 创建枚举对象(spring,summer,autumn,winter)时 , 必须要知道它调用的是哪个构造器 , 如果使用无参构造器创建枚举对象 , 则实参列表和小括号都可以省略 ;
3. 有多个枚举对象时 , 要使用 " , " 来分隔开 , 最后有一个分号结尾 ;
4. 枚举对象必须写在枚举类的行首 ;
5. 即使使用enum去实现枚举类,这个枚举类中的枚举对象也是用static final 来修饰的 ;
public class Enum {
public static void main(String[] args) {
//输出自定义的四个对象
System.out.println(Season.spring);
System.out.println(Season.summer);
System.out.println(Season.autumn);
System.out.println(Season.winter);
}
}
//使用关键字enum实现枚举类:
enum Season
{
// public static final Season spring=new Season("春天","温暖");
// public static final Season summer=new Season("夏天","炎热");
// public static final Season autumn=new Season("秋天","凉爽");
// public static final Season winter=new Season("冬天","寒冷");
//如果使用enum来实现枚举类:
//1.使用关键字 enum 替代 class
//2.不需要使用public static final Season spring=new Season("春天","温暖"),
// 而是直接用spring("春天","温暖");
//3.如果有多个常量(对象),则需要使用","来分隔 , 最后以";"结尾;
//4.如果使用enum实现枚举,必须将枚举对象放在枚举类的行首,否则会报错;
spring("春天","温暖"),summer("夏天","炎热"),
autumn("秋天","凉爽"),winter("冬天","寒冷");
private String name;
private String desc;
//私有化构造方法,这样可以避免通过构造方法自己创建对象
private Season(String name,String desc)
{
this.name=name;
this.desc=desc;
}
//自定义枚举避免更改对象属性值,去除set方法,只有get方法变为只读模式
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
6. 当在这个enum枚举类中使用toString方法时 , 如果没有重写toString方法则默认会调用父类Enum中的toString方法 ; Enum类中的toString方法会返回enum枚举类中创建的枚举对象名name ;
三. 由于enum实现的枚举类继承了Enum类,所以也继承了Enum类中的方法 :
1. 以下是Enum中的成员 :
2. 以下代码是通过enum创建的枚举对象来调用父类Enum中的各个方法 :
public class EnumMethod {
public static void main(String[] args) {
//用autumn对象来接收Season中的静态常量枚举对象autumn:
Season autumn = Season.autumn;
//name() 表示输出该枚举对象的名字:
System.out.println(autumn.name());
//ordinal() 表示输出的是该枚举对象的次序/编号 ,从0开始编号,所以autumn应该是第2个:
System.out.println(autumn.ordinal());
//values() 会返回Season[]数组, 这个数组包含了所以枚举对象:
Season[] value=Season.values();
for(Season x:value)
{
System.out.println(x);
}
//valueOf : 将字符串转换成枚举对象,要求字符串必须为已有的常量,否则报错
Season autumn1=Season.valueOf("autumn");
System.out.println("autumn1= "+autumn1);
//compareTo : 比较两个枚举常量,比较的就是编号ordinal() , 输出结果是两个编号相减的结果为2
System.out.println(Season.autumn.compareTo(Season.spring));
}
}