package com.zhou.testenum;
/**
* 使用enum定义枚举类:
* JDK1.5之后新增的enum关键字用于定义枚举类;
* 枚举类和普通类的区别:
* 1.使用enum定义的枚举类默认继承了java.lang.Enum类;
* 2.枚举类的构造器只能使用private访问控制符;
* 3.枚举类的所有实例必须在枚举类中显示列出(,分隔 ;结尾),列出的实例系统会自动添加public static final修饰;
* 4.所有的枚举类都提供了一个values方法,该方法可以很方便的遍历所有的枚举值;
*
* JDK1.5中可以在switch表达式中使用枚举类的对象作为表达式,case子句可以直接使用枚举值的名字,无需添加枚举类作为限定;
* 若枚举只有一个成员,则可作为一种单子模式的实现方式;
*
* 枚举类的属性:
* 枚举类的对象的属性不应允许被改动,所以应该使用private final修饰;
* 枚举类使用private final修饰的属性应该在构造器中为其赋值;
* 若枚举类显示的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数;
*/
/**
* 实现了接口的枚举类:
* 和普通java类一样,枚举类可以实现一个或多个接口;
* 若需要每个枚举值在调用实现的接口方法呈现不同的行为方式,则可以让每个枚举值分别来实现该方法;
*
*
*/
public enum Season2 implements TimeInfo{
//将class关键字换成enum,这样就是一个枚举类,并实现
TimeInfo接口
;
//2.必须在枚举类的第一行写出有哪些枚举值;
//
SPRING,SUMMER,FALL,WINTER;//这样写完之后,public enum Season2 {这行出错了,是因为那两个属性常量值没有被赋值,因为写的是有参的构造器,如果是无参的构造器就能这样写;
SPRING("春天","春风又绿江南岸"){
@Override
public String getTimeInfo() {
return "2月-5月";
}
},SUMMER("夏天","映日荷花别样红"){
@Override
public String getTimeInfo() {
return "5月-8月";
}
},FALL("秋天","秋水共长天一色"){
@Override
public String getTimeInfo() {
return "8月-11月";
}
},WINTER("冬天","窗含西岭千秋雪"){
@Override
public String getTimeInfo() {
return "11月-2月";
}
};
//写枚举值是传入属性值,每一个就是一个对象,写这个枚举值的时候实际上是利用了构造器创建的对象;
//----这四个枚举值就是四个常量,即四个对象;
//1.写属性;
private final String name;
//季节的名字;写完之后这一行出错了,是因为我们要在第一行中写出有哪些枚举值;
private final String desc;
//季节的描述;
//3.因为属性值不同的对象是变化的,给属性值赋值当然是用构造器进行赋值;
private Season2(String name, String desc) {
//这样写完构造器之后,第一行列出枚举值的那行出错了,因为你在创建对象的时候,并没有传入name与desc的值,在创建构造器的时候只有一个private,是不可选的;
this.name = name;
this.desc = desc;
}
//4. 写getter方法;
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
/**
* 以下这种方式可以实现,但是太麻烦了,但是还有一种更好的方式:就是在创建枚举对象的时候同时提供这个方法的实现;
*/
//
@Override
//
public String getTimeInfo() {//实现这个方法我得对每个季节提供一个单独的实现,因为季节的时间跨度是不一样的,当然可以去判断是哪个季节,然后一个一个的实现;
// System.out.println(this.toString().equals("SPRING"));
// return null;
//
}
//5.写toString()方法;
//----不让在里面写;
}
//定义枚举类实现的接口;
package com.zhou.testenum;
public interface TimeInfo {
public String getTimeInfo();
}
package com.zhou.testenum;
public class TestSeason {
/**
* 测试枚举:
*/
public static void main(String[] args) {
//
Season SPRING = Season.SPRING;
//
System.out.println(Season.SPRING.getName());
System.out.println(Season2.SPRING);
//这样显示的是枚举值对应的那个字符串;
//使用values方法,该方法可以很方便的遍历所有的枚举值;
for(Season2 s:Season2.values()){
//
System.out.println(s);
//
//
System.out.println(s.toString().equals("SPRING"));//直接在枚举类实现方法的测试;
System.out.println(s.getTimeInfo());
//在创建每个枚举值即枚举对象时,各个枚举对象同时实现接口的方法的测试;
}
/**
* 枚举类的valueof方法测试:
*/
String str = "WINTER";
//我希望用这个字符串来获取我对应的那个枚举类对象,可以使用valueof方法;
Season2 s1 = Season2.valueOf(Season2.class, str);
System.out.println(s1.getName());
}
}