第十二集 枚举
/**
* 为什么要用枚举
* 问题:定义星期几或性别的变量,该怎么定义?
* 假设用1-7分别表示星期一到星期日,但有人可能会写成int weekDay = 0;
* 枚举就是要让某个类型的变量取值只能为若干个固定值中的一个,否则,编译器就会报错。
* 枚举可以让编译器在编译时就可以控制源程序中填写的错误信息,普通的变量的方式在开发阶段无法实现这一目标
*
* 用普通枚举如何实现枚举的功能,定义一个WeekDay的类来模拟枚举功能。
* --私有的构造方法
* --每个元素分别用一个公有的静态变量表示
* --可以有若干个公有方法或抽象方法,例如,要提供nextDay()方法必须是抽象的。
* 采用抽象方法定义nextDay()就将大量的if else 语句转移成一个个独立的类
*
* 枚举的基本应用
* --举例:定义一个WEekDay的枚举
* 扩展:枚举类的values,valueOf,toString,ordinal等方法
* 总结:枚举是一种特殊的类,其中每个元素都是该类的一个实例对象,
* 例如可以调用WeedDay.SUN.getClass().getName和WeekDay.class.getName()。
*
*
* 枚举就相当于一个类,其中也可以定义构造方法,成员变量,和普通方法和抽象方法
* 枚举元素必须位于枚举体中的最开始的部分,枚举元素列表的后要有分号与其他成员分隔。
* 把枚举中的成员方法或者变量等放在枚举元素的前面,编译器报告错误。
* 带构造方法的枚举
* --构造方法必须定义成私有的。
* --如果有多个构造方法,该如何选择哪个构造方法?
* --枚举元素MON和MON()的效果一样,都是默认调用的构造方法。
* 带方法的枚举
* --定义枚举TrafficLamp
* --实现普遍的next方法
* --实现抽象的next方法:每个元素分别是由枚举的子类来生成的实例对象,这些子类采用类似内部类的方法定义
* --增加上表时间的方法
* 枚举只有一个成员时,就可以作为一种单例的实现方式
*/
概念:
枚举就是让某些类型的变量只能取若干固定值中的一个,否则编译就会报错,枚举可以让编译器的在编译时就确定源文件中错误数据。
枚举本质:
限定一个类的实例对象的数量,当一个类的实例化对象的数量是在限定范围内,那么就可以定义这个类为一个枚举类型。
枚举的实现:
1.枚举类也是一种特殊形式的Java类,使用enum定义枚举类。
2.枚举类中声明的每一个枚举值代表枚举类的一个实例对象。
3.与java中普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数。
4.所有自定义的枚举都继承Enum这个类。
5.格式:
enum 枚举名称{ 枚举值1,枚举值2,枚举值3.....}
6.使用:可以使用 枚举名称.枚举值来调用每个枚举对象。
枚举成员:
1.枚举值:枚举值是一个常量,也可以称作枚举常量,通过javap命令可以看到,每个枚举值的修饰符是 public final static ,系统会自动添加这些修饰符。
2.成员变量:枚举中也有成员变量。
3.构造方法:枚举中也有一个无参的默认的构造方法,因为对应的枚举常量的数量是在限定范围内,不能再创建其他对应的枚举常量,所有构造方法是私有化的。一旦创建了有参的构造方法,无参的构造方法也就会消失。
4.一般方法:可以有一般方法,每个枚举值可调用。
5.抽象方法:枚举中可以存在抽象方法。一旦有抽象方法,每个枚举值必须要覆写这个抽象方法,格式类似于匿名内部类的写法.
枚举值(){
被覆写的抽象方法(){ }
}
package cn.itcast.day1;
import java.util.Date;
public class EnumTest {
/**
* 第十二集 枚举
* @param args
* 定义了一个新的类型WeekDay
* 以后用到这个类型里面的值只能是我提前定义好的值
* 如果不是里面的值,编译器都不让通过,在编译的时候就发现不合法
*
*/
/**
* 第十三集 枚举 举例
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
WeekDay1 weekDay = WeekDay1.MON;
System.out.println("11--"+weekDay.nextDay());
WeekDay weekDay2 = WeekDay.FRI;
System.out.println("22--"+weekDay2);
System.out.println("33--"+weekDay2.name());
/**
* 此元素FRI在枚举中第几个位置
*/
System.out.println("44--"+weekDay2.ordinal());
System.out.println("55--"+weekDay2.compareTo(weekDay2));
/**
* 得到这个元素属于哪个类
*/
System.out.println("66--"+weekDay2.getClass());
System.out.println("77--"+WeekDay.valueOf("SUN"));
System.out.println("88--"+WeekDay.values().length);
new Date();
}
public enum WeekDay{
/**
* 在这个元素的后面有一括号,再指向一个参数,指定参数列表
* 表示创建实例对象的时候用到哪个构造方法
*/
SUN(1),MON,TUE,WED,THI,FRI,SAT;
private WeekDay(){System.out.println("first");}
private WeekDay(int day){
System.out.println("second");
}
}
public enum TrafficLamp{
/**
* RED是这个类TrafficLamp的子类的实例对象
* RED是由这个类TrafficLamp的子类来写的,这个子类的名字不知道
* 既然是子类就必须完成父类的方法
* 交通灯里面有三个匿名的类
*/
RED(30) {
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return GREEN;
}
},GREEN(45) {
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return YEELLOW;
}
},YEELLOW(5) {
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return RED;
}
};
public abstract TrafficLamp nextLamp();
/**
* 私有成员变量
* 每个灯都有自己的时间
*/
private int time;
/**
* 每个灯都有自己的时间是怎么构成?
* 通过构造方法。必须写成私有的
*/
private TrafficLamp(int time){
this.time = time;
};
}
}
第十一集 自动装箱和拆箱
package cn.itcast.day1;
public class AutoBox {
/**
* 第十一集 自动装箱和拆箱
* @param args
*/
public static void main(String[] args) {
/**
* 自动装箱
* 自动把一个基本数据类型装成Integer对象赋值给了引用变量
*/
Integer iObj = 3;
/**
* 拆箱
* Integer对象不支持加法,必须转换成基本数据对象,
* 基本整数在进行加法
*/
System.out.println(iObj + 12);
String s1 = new String("abc");
String s2 = new String("abc");
/**
* 运行结果 15 true false* 对于基本类型的整数装箱称为Integer对象的时候 * 如果这个数字在一个字节之内(-128——127)之间 * 一旦包装称为一个Integer对象之后就会把它缓存起来 * 装在一个池里面,下次再调用的时候,先看有没有 * 有的话,直接从池里面拿来,节省了内存空间* 这个对象不怎么改变 * 这种设计叫做一种设计模式 * 当这个数据很小,有好多的对象都用,就搞一个对象大家都用* 叫做享元模式 flyweight * 有很多小的对象他们有很多属性相同,把他们变成一个对象 * 那些不同的属性把他们变成方法的参数称之为外部状态* 那些相同的属性称之为内部状态 * 小的整数使用的频率比较高* 大的整数的使用频率比较低
*/
Integer i1 = 13;
Integer i2 = 13;
System.out.println(i1==i2);
Integer i3 = 137;
Integer i4 = 137;
System.out.println(i3==i4);
Integer i5 = Integer.valueOf(127);
Integer i6 = Integer.valueOf(127);
System.out.println(i5==i6);
Integer i7 = Integer.valueOf(128);
Integer i8 = Integer.valueOf(128);
System.out.println(i7==i8);
}
}