---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
基础加强-枚举
一,myeclipse 是eclipse的一个插件。eclipse是一个ide集成开发环境。
二,简写:
IDE:integrated development environment 集成开发环境
三,透视图就是一些不同的小窗口的集合
四。导入工程:
1,先把工程文件复制到eclipse的工作台目录下。
2,然后使用eclipse的import 进行导入
五,枚举(Enumeration)
1,为什么要有枚举?
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错,枚举可以让编译器在编译时就可以控制源程序中填写的
非法值,普通变量的方式在开发阶段无法实现这一目标的。
2,如果使用普通类来实现枚举功能,定义一个WeeKday的类?
1,将构造函数私有
2,每个元素分别用一个公有的静态全局变量表示本类对象(使用 public static final 类名 变量名 定义全局变量)
3,可以有若干公有方法或抽象方法,
例如:要提供nextDay方法必须是抽象的。返回值类型为本类类型(自定义枚举类类型) 采用抽象方法定义nextDay就是将大量的if.else语句转移成了一个个独立的类
提供String toString()方法,也必须是抽象的 。返回这个对象的值。
自定义枚举类定义的对象只能有规定的那个几个值,不可以有其它的值。
个人理解:
就是定义一个类,将其构造函数私有化。在本类创建对象。(有点单例思想,不过人家单例是一个对象,枚举是多个对象)然后在类中定义一个全局变量,并且这个变量的值就是本类对象也就可以说是一个子类。
在自定义类中定义一些方法比如nextObject方法,toString()方法,nextObject方法是用来取出下一个对象。可以定义在父类中,但
是定义在父类中还要进行对象判断,才能进行获取下一对象。因为每个子类对象都有的方法,并且取出的每一个对象都不相同,
所以可以将这个nextObject方法抽象化,让其子类去实现,指定要返回的下一个对象。toString方法也是一样,每个子类对象所对的值都不一样,
只有子类自己最清楚要返回什么的值,所以也可以将其抽象,让其子类去实现,因为此类有抽象方法,所以此父类也必须为抽象类。
而全局变量指向的本类对象也不需要什么名字,只是指向一个实体对象罢了。只要把父类中的抽象方法实现就行,所以使用匿名内部类来完成。也可以在父类中定义一个类继承
其父类复写其方法,然后在建立对象赋值给全局变量,不过有点麻烦。
代码:
public abstract class DefineEnumeration {
//在这个类中定义类类型的全局变量,并将赋值为本类对象
public final static DefineEnumeration RED = new DefineEnumeration(){
//复写父类中的抽象方法
public DefineEnumeration nextObject(){
return GREEN;
}
public String toString(){
return "liuce+red";
}
};
public final static DefineEnumeration GREEN= new DefineEnumeration(){
@Override
public DefineEnumeration nextObject() {
// TODO Auto-generated method stub
return YELLOW;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "liuce+green";
}};
public final static DefineEnumeration YELLOW = new DefineEnumeration(){
@Override
public DefineEnumeration nextObject() {
// TODO Auto-generated method stub
return RED;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "liuce+yellow";
}};
//因为每个子类都有一个可以获取一下对象的方法,并且获取的对象是不一样,可以将其定义在父类中,
///将其抽象化,让其子类去实现,就不用判断了可以直接返回下一对象
public abstract DefineEnumeration nextObject();
//定义一个可以返回子类对象的值的方法,让其子类进行实现
public abstract String toString();
3,枚举的基本应用
1,定义枚举的格式 :
修饰符 enum(关键字) 类名{
元素1,元素2,元素3,...结尾没有分号(元素也就是我们自定义类的全局变量,代表本类的对象)
}
使用enum定义的枚举类不用在写toString方法了,系统已经为我们定义好了,其返回值就是元素的名字与元素中的name()方法的返回一样。
2,枚举中的一些方法:
元素的方法:
String toString():返回此元素的字符串形式,也就是它的名字。
String name():返回此元素的名字与toString方法返回值一样。
int ordinal():返回自己在父类中的排行。 从0开始计算
boolean equals(Object othe):比较是否是同一元素
int compareTo(Object obj):比较大小
枚举类的静态方法:
static T valueOf(String args):参数为一个元素的名字,此方法会返回一个与参数名字相对应的T类型的对象(一般是元素)
static T[] value():返回这个枚举类中的所有元素的数组 对枚举中的元素进行遍历
注:自定义枚举类没有这些静态方法,自定义的方法也要位于元素之后,如果有自定方法的话,最后一个元素要以;结束.元素默认是调用无参数的构造方法
如果想调用有参数的构造方法可以在元素后加(),在括号里面传入与参数类型(父类的构造方法的参数)相同的实际参数就可以了。当没有参数时
也可以加上(),不加也可以。
枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,。
2,定义枚举的构造方法
注意:方法必须在元素之后,并且元素是以;结束的,此构造方法为必须为私有的,(防止其他类建立本类对象)
格式:
private 类名(参数列表){}
3,复写父类中的抽象方法
格式:元素{复写父类的抽象方法},元素{复写父类中的抽象方法},元素{复写抽象方法};
如果有需要参数传入时:元素(实际参数){复写父类听抽象方法},
4,定义成员变量
prvate 类型 变量名
注:当枚举只有一个成员时,就可以作为一种单例的实现方式。
代码:
public enum TrafficLamp {
//定义元素,代表本类对象,并复写父类中的抽象方法,因为自定了构造 函数,默认空参数的构造函数没有了,所以都要传入实际的数值
RED (40){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return GREEN;
}
},GREEN(20) {
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return YELLOW;
}
},YELLOW(10) {
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return RED;
}
};
//给类定义一个变量用来存储时间的,将私有,可以提供对外的访问方法
private int time;
//定义一个构造方法,它的修饰符为私有的,为了不让其它 的类创建对象
private TrafficLamp(int time){
this.time = time;
}
//定义可以返回下一个灯的抽象方法让其子类实现,返回值是父类,父类引用指向子类对象
public abstract TrafficLamp nextLamp();
}