枚举类:实例有限而且固定的类
手动实现枚举类:直接使用public static final修饰常量
枚举类入门:定义枚举类关键字enum是一种特殊的类
枚举类与普通类的区别:
1、可以实现一个或多个接口,使用enum定义默认继承了java.lang.Enum类,不继承Object以及其他类
2、实现了java.lang.Serializable和java.lang.Comparable两个接口
3、使用enum定义,非抽象的枚举类默认会使用final修饰,枚举类不能派生子类
4、枚举类的构造器只能用private控制,没写修饰的话,默认private
5、枚举类所有实例必须在枚举类第一行显式列出,否则永远无法产生实例
6、默认提供values()方法遍历枚举值
public enum SeasonEnum{
Spring,Summer,Winter,Fall;
}
使用枚举类实例
package practice;//这里有点问题
import java.lang.*;
import java.util.*;
enum SeasonEnum{
Spring,Summer,Winter,Fall;
}
public class Main{
public void judge(SeasonEnum s) {
switch(s) {
case Spring://case可以直接使用,不需要通过类名
System.out.println("春暖花开");
break;
case Summer:
System.out.println("2");
break;
case Fall:
System.out.println("3");
break;
case Winter:
System.out.println("4");
break;
}
}
public static void main(String[] args) {
for(SeasonEnum s:SeasonEnum.values()) {
System.out.println(s);//==toString();
}
new Main().judge(SeasonEnum.Spring);//通过这个形式访问实例
}
}
枚举类的成员变量、方法和构造器
枚举类的实例只能是枚举值,不是通过new来构造
package practice;
import java.lang.*;
import java.util.*;
enum Gender{
Male,Female;
public String name;//成员变量
}
public class Main{
public static void main(String[] args) {
Gender g=Enum.ValueOf(Gender.class,"Female");//通过Eunm的valueOf方法来获取指定枚举类的枚举值
g.name="女";
System.out.println(g+"代表"+g.name);
}
}
改进版增加封装性:
package practice;
import java.lang.*;
import java.util.*;
enum Gender{
Male,Female;
private String name;//避免其他程序直接访问
public void setName(String name) {
switch(this) {
case Male:
if(name.equals("男")) {
this.name=name;
}
else {
System.out.println("Wong");
return;
}
break;
case Female:
if(name.equals("女")) {
this.name=name;
}
else {
System.out.println("wrong");
}
break;
}
}
public String getName() {
return this.name;
}
}
枚举类通常应该设置成不可变类,应该讲成员变量都使用private final修饰
所以必须在构造器里为这些成员变量指定初始值(或者在定义成员变量时指定默认值,或在初始化块中指定初始值)即枚举类显式定义了带参数构造器,列出枚举值时就必须对应的传入参数。
package practice;
import java.lang.*;
import java.util.*;
enum Gender{
Male("男"),Female("女");
private final String name;
private Gender(String name) {
this.name=name;
}
public String getName() {
return this.name;
}
}
当Gender枚举类创建一个构造器以后,列出的枚举值就用粗体字,在枚举类中列出枚举值时,实际上就是调用构造器创建枚举类对象,只是不需要用new,也无需显式构造器。
枚举类也可以实现多个接口,使用方法和普通类一样
如果由枚举类来实现接口里的方法,则每个枚举值在调用该方法时都有相同的行为方式。
如果需要每个枚举值在调用该方法时呈现出不同的行为方式,则可以让每个枚举值分别来实现该方法,每个枚举值提供不同的实现方式
enum Gender implements GenderDesc{
Male("男")
{
public void info() {
System.out.println("代表男性");
}
},//这里花括号是一个整体
Female("女");
{
public void info() {
System.out.println("代表女性");
}
};
}
包含抽象方法的枚举类