枚举类型

1、JDK1.5增加了枚举类型,可以使用enum来定义
写的是enum但本质是类,枚举源代码换了,但编译后还是class文件;而且默认就是fianl修饰以及默认继承父类java.lang.Enum。
注:enum是java中的一个关键字,Enum是java中的一个类
例如:

public enum Gender{
MALE,FEMALE;
//其中每一个枚举元素都是该枚举类型的一个实例,并且默认是用public static final修饰的
//完整写法MALE(),FEMALE();两个对象;调用无参构造器,不写默认有,但要是写了有参构造器,就必须把无参构造器也写出来:
private String name(){}
//若下面有有参构造器:则可调用有参构造器MALE("男");FEMALE("女");查看要重写toString

 private Gender(String name){
 this.name=name}
	}																
	}

注:枚举类型构造器是自动生成的且是私有的,表示不可再创建对象。(使用反射也不行)

2、获取枚举对象的三种方式

public class Test{
	main{
	Gender g1=Gender.MALE;
	Gender g2=Gender.FEMALE;//获取里面对象的第一种方法

	Gender g3=Gender.valueOf("MALE");
	Gender g4=Gender.valueOf("FEMALE");///获取里面对象的第二种方法

	Gender g5=Enum.valueOf(Gender.class,"MALE");
	Gender g6=Gender.valueOf(Gender.class,"FEMALE");///获取里面对象的第三种方法
	}
}

3、获取枚举类型的所有对象

Gender[] values =Gender.values();
for(Gender g:values){
	System.out.println(g);
}

4、枚举类型的方法
枚举类型对象,默认只能调用父类Emun中的方法以及Object类中的方法

枚举类型想要调用自己的方法,也可以在枚举类型中定义自己的方法;
枚举也是类,只是一种特殊的类而已,所以枚举类型中可以定义很多东西,像在类中一样

例如:

public enum Gender {
			MALE,FEMALE;
			
			public void say(String name){
				System.out.println("hello "+name+","+this);
			}
			public static void main(String[] args) {
				Gender g1 = Gender.FEMALE;
				Gender g2 = Gender.MALE;
				
				g1.say("tom");
				g2.say("tom");
			}
		}
	//也可以定义静态方法

5、枚举类型的属性
就像上面说的,枚举类型是一种特殊的类,可以定义很多东西,当然也可以定义属于自己的属性

public enum Gender{
	MALE,FEMALE;
	private String name;
	public String getName(){
		retuen name;
	}
	public void setName(String name){
			this.name=name;
	}
	//重写toString方法
	public String toString(){
		return this.getName();
	}
	publci static void main(String[] args){
		//获取枚举类型对象
		Gender g=Gender.MALE;
		g.setName("女");
		System.out.println(g);//输出结果为:女(重写了toString方法)
		
	}
}

5、枚举类型的构造器
枚举类型自动生了一个私有的无参构造器;
在枚举类型中定义其构造器,但是必须是私有的private修饰
在声明枚举对象的时候,其实就是在调用构造器,默认是隐式调用其无参构造器,也可以显式调用有参构造器
例如:

public enum Gender {
			MALE("男"),FEMALE("女");
			
			private String name;
			private Gender(String name){
				this.name = name;
			}
			Gender(){
				this("");
			}
			public String toString() {
				return this.name;
			}
			public static void main(String[] args) {
				Gender g = Gender.FEMALE;
				System.out.println(g);//输出:女
			}
		}

6、枚举类型的抽象方法
枚举类型中可以编写抽象方法,但是这时候其每个对象都必须去实现这个抽象方法,否则编译报错。
形式上很像匿名内部类对象
例如:

public enum Gender{
	MALE(){
		public abstract void tun(){
			System.out.println("MALE对象实现的run方法")
		}
	}
	//MALE和FEMALE之间的,和FAMLE后面的;不能忘记写
	,FEMALE(){
		public abstract void tun(){
			System.out.println("MALE对象实现的run方法")
		}
	};
	public abstract void tun();
	
}

7、枚举类型可以实现接口
枚举类型不能指定继承其他父类,但是可以实现其他接口
实现接口中的方法可以在对象之外写实现也可以在每个枚举对象中分别写方法实现
例如:

public interface Action{
			void doSomeThing();
		}

		public enum Gender implements Action{
			MALE,FEMALE;

			public void doSomeThing() {
				System.out.println("Gender go..");
			}
		}
public interface Action{
			void doSomeThing();
		}
		public enum Gender implements Action{
			MALE(){
				public void doSomeThing() {
					System.out.println("MALE go...");
				}
			},FEMALE(){
				public void doSomeThing() {
					System.out.println("FEMALE go...");
				}
			};
		}