Enum枚举:就是我们所说的 列举,从给定的值中列举,通常都是有固定值,只能从固定值中去做选择。
比如:商品有入库IN和出库OUT状态;性别有男女之分;一周有周一到周日等等可列举的。
语法:[修饰符] enum 枚举名{}
比如:商品有入库和出库状态
//商品类
public class Goods {
private Integer id;//商品的id
private String name;//商品的名字
private StatusEnum status;//0:出库状态 1:入库状态
//构造方法
//Getter()和Setter()方法
//toString()方法
}
测试一下:
Goods goods=new Goods(1,"手机",0);
但是这样容易出现用户误操作的情况。我们定义的是0:出库状态 1:入库状态,用户在输
入的时候可能输入2或者3或者其他数字,也就不符合我们定义的初衷了。
那我们如何避免这种情况呢?
我们可以把状态写成IN(入库)或者OUT(出库),这样我们就使用到了枚举Enum。
我们可以创建Enum枚举类。
public enum StatusEnum {
IN,OUT
}
那我们上面那段代码就可以修改成:
Goods goods=new Goods(1,"手机",StatusEnum.IN);
values():以数组形式返回枚举类型的所有成员
valueOf():将字符串转换成枚举实例
ordinal():获取枚举成员的索引
compareTo():比较两个枚举成员的在定义时的顺序
枚举类:
public enum StatusEnum {
IN(1,"入库"),OUT(2,"出库");
private String name;//状态名称
private Integer index;//状态索引
StatusEnum(Integer index,String name) {
this.index=index;
this.name=name;
}
}
//values():以数组形式返回枚举类型的所有成员
StatusEnum[] values = StatusEnum.values();
for (StatusEnum value : values) {
System.out.print(value+"\t\t");//IN OUT
}
//ordinal()//获取枚举成员的索引位置
System.out.println(StatusEnum.IN.ordinal());//0
System.out.println(StatusEnum.OUT.ordinal());//1
注意这里输出的索引位置是0和1,不是我们所定义的IN(1,“入库”),OUT(2,“出库”),注意区分。
//compareTo():比较两个枚举成员的在定义时的顺序
int i = StatusEnum.IN.compareTo(StatusEnum.OUT);
System.out.println(i);//-1 因为IN在OUT的前面
int i1 = StatusEnum.OUT.compareTo(StatusEnum.IN);
System.out.println(i1);//1
int i2 = StatusEnum.IN.compareTo(StatusEnum.IN);
System.out.println(i2);//0
我们来反编译一下StatusEnum类(javap命令)
t1.StatusEnum> {
public static final com.coder.enumtest1.StatusEnum IN;
public static final com.coder.enumtest1.StatusEnum OUT;
public static com.coder.enumtest1.StatusEnum[] values();
public static com.coder.enumtest1.StatusEnum valueOf(java.lang.String);
static {};
}
从上面可以看出:
//枚举在switch中的应用
StatusEnum[] values = StatusEnum.values();
int i= new Random().nextInt(2);
switch (values[i]){
case IN:
System.out.println("入库");
break;
case OUT:
System.out.println("出库");
break;
}
类似于我们手机中的闹钟,在定时任务中,我们要用到Timer
我们可以看到Timer的schedule()方法中,有这几种参数类型:
public class Task extends TimerTask {
@Override
public void run() {
System.out.println("hello China");
}
}
public class Test {
public static void main(String[] args) {
Task task=new Task();
Timer timer=new Timer();
timer.schedule(task,1000);//延迟1秒钟
}
}
public class Test {
public static void main(String[] args) {
Task task=new Task();
Timer timer=new Timer();
timer.schedule(task,0,1000);//不延迟,间隔时间为1秒钟(也就是每隔1秒钟打印一次hello China)
}
}
由于这个类我们只使用一次,我们可以考虑把它写成匿名内部类
public class Test {
public static void main(String[] args) {
Timer timer=new Timer();
//写成内部匿名类
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("hello China");
}
},0,1000);
}
}
划重点啦啦啦啦!!!!
Timer只适用于单线程任务。
对于取消该定时器的话,会有一个cancel()方法,但是这个方法需要遇到事件触发它,才可以使用
java.lang.System系统
方法:
currentTimeMills():获取从1970-01-01 00:00:00到现在的毫秒数
exit():退出java虚拟机 0代表正常退出 ,否则异常退出
getenv(String):获取指定的环境变量
getPropert(String):获取系统属性
getProperties():获取所有系统属性
arraycopy(源,源索引,目标,目标索引,长度):从源数组指定索引位置复制给定长度到目标数组的索引位置
gc():执行垃圾回收