关键字枚举enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能。
enum的特性
1、创建enum时,编译器会给你生成一个相关的类,这个类继承java.lang.neum,因此定义的neum不能够继承,但可以实现接口
2、enum常亮 Position
left ,right("右方向"), front, back;
这些常量即可以这样理解定义了一个类
public class Position{
public static Position right=new Position();
public static Position left=new Position();
}
带有变量的即可以理解为带有变量的构造方法,
Position position=Position.left;
相当于返回一个position对象。
3、neum类可以含有抽象方法
但是抽象方法必须在常亮中进行定义,否则会报错
首先在neum中定义个public abstract void sayHello();
在常亮中实现
left{
public void sayHello(){
System.out.println("hello world");
}
}
4、switch语句中的enum
我想在这里是挺奇怪的,通过将java程序编译后,然后反编译看源码,会发现编译时
做了一些代码生成。
@Test
public void testSwitch(){
Position position=Position.left;
switch (position) {
case left:
System.out.println("左方向");
break;
case right:
System.out.println("右方向");
break;
case front:
System.out.println();
default:
System.out.println("other");
break;
}
}
5、enum中的常用方法
@Test
public void testMethods(){
Position position=Position.left;
System.out.println("name方法 "+position.name());
System.out.println("toString方法 "+position.toString());
System.out.println("ordinal方法 "+position.ordinal());
System.out.println("values方法 "+Position.values().length);
}
输出结果
name方法 left
toString方法 left
ordinal方法 0
values方法 4
这些方法除了values都是继承自neum类
那么values方法来自于哪里,这个数组里存了什么值呢?
其实这可以编译后,在反编译查看源码,便知道是自动生成的方法。
这个方法里面存的便是neum中常亮,也可以说是对象。
附上代码
package jsu.java.menu;
import org.junit.Test;
enum Position{left{
public void sayHello(){
System.out.println("hello world");
}
}
,right("右方向"){
public void sayHello(){
System.out.println("hello world");
}
},front{
public void sayHello(){
System.out.println("hello world");
}
},back{
public void sayHello(){
System.out.println("hello world");
}
};
private String poi;
private Position(){
}
private Position(String poi){
this.poi=poi;
}
public String getPoi() {
return poi;
}
public void setPoi(String poi) {
this.poi = poi;
}
public abstract void sayHello();
};
public class basicEnum {
@Test
public void testObject(){
System.out.println("输出对象");
Position l=Position.left;
System.out.println("toString() 方法 ="+l.toString());
System.out.println(l);
Position r=Position.right;
System.out.println(r);
}
@Test
public void testAssigine(){
Position r=Position.right;
String right = r.getPoi();
System.out.println(right);
}
@Test
public void testSwitch(){
Position position=Position.left;
switch (position) {
case left:
System.out.println("左方向");
break;
case right:
System.out.println("右方向");
break;
case front:
System.out.println();
default:
System.out.println("other");
break;
}
}
@Test
public void testMethods(){
Position position=Position.left;
System.out.println("name方法 "+position.name());
System.out.println("toString方法 "+position.toString());
System.out.println("ordinal方法 "+position.ordinal());
System.out.println("values方法 "+Position.values().length);
}
}