认识枚举:
枚举是一种特殊的类。
枚举类的格式:
说明:
第一行是罗列枚举的对象名称。只能写合法的标识符(名称),多个名称用逗号隔开。
这些名称本质上都是常量,每个变量都会记住枚举类的一个对象。
第二行:可以是类的五大成员。
反编译的情况,我们看到有一个私有的构造器:
javap的用法:我们可以看到更详细的枚举类信息:
枚举类的特点:
枚举类的第一行只能罗列一些名字,这些名称都是常量,并且每个常量记住的都是枚举类的一个一对象。
枚举类的构造器都是私有的(写不写都只能是私有的),因此,枚举类不能创建对象。
枚举类是最终类,不可能被继承。
枚举类中,从第二行开始,可以定义类的其他成员。
编译器为枚举类新增了几个方法,并且枚举类都是继承java.lang.enum类的,从enum类也会继承到一些方法。
测试类:
package cn.ensource.d6_enum;public class Test {public static void main(String[] args) {// 目标:认识枚举A a1 = A.X;System.out.println(a1);// 枚举不能创建对象// 枚举类的第一行都是常量,记住的是枚举类的对象A a2 = A.Y;System.out.println(a2);// 枚举类提供了一些额外的APIA[] as = A.values(); // 拿到全部对象A a3 = A.valueOf("Z");System.out.println(a3.name());System.out.println(a3);System.out.println(a3.ordinal()); // 索引}
}
那抽象枚举如何实现呢?
package cn.ensource.d6_enum;// 抽象枚举
public enum B {// 抽象枚举,如何逻辑枚举,因为枚举类B不能直接构建对象,而第一行都是枚举类的对象// 那么就要调用私有的构造器来创建对象,里面需要使用方法重写来把抽象方法重写,多态X() { // 构造器@Overridepublic void go() { // 构建对象的时候,重写go方法}},Y("张三") {@Overridepublic void go() {System.out.println(getName() + "在跑~");}};private String name;private B() {}private B(String name) {this.name = name;}public abstract void go();public String getName() {return name;}public void setName(String name) {this.name = name;}
}
这个代码已经算是比较深了。
测试类中:
多学一招:
使用枚举类实现单例设计模式:
package cn.ensource.d6_enum;public enum C {X; // 单例
}
好牛啊!!!
枚举的常见应用场景:
非常适合用来表示一组信息,然后作为参数进行传播。
用来做信息的分类和标志。
选择定义一个一个的常量来表示一组信息,并作为参数传输。
参数值不受约束;
选择定义枚举表示一组信息,并作为参数传递。
代码可读性好,参数值得到了约束,对使用者更友好,建议使用。
常量类Constant:
package cn.ensource.d7_enum;public class Constant {public static final int BOY = 0; // 常量性能没有影响public static final int GIRL = 1;
}
测试类:
package cn.ensource.d7_enum;public class Test {public static void main(String[] args) {// 目标:掌握枚举的应用场景,做信息标志和分类
// check(0);check(Constant.BOY);}public static void check(int sex) {switch (sex) { // 硬编码,可读性不好case Constant.BOY:System.out.println("展示男人想看的信息");break;case Constant.GIRL:System.out.println("展示女人想看的信息");break;}}
}
这个是软编码。
常量还是存在一个问题:
要求是常量,我们还是写自变量。
int sex形参是不受约束的。
常量类Constants2:
package cn.ensource.d7_enum;public enum Constant2 {BOY, GIRL;
}
package cn.ensource.d7_enum;public class Test {public static void main(String[] args) {// 目标:掌握枚举的应用场景,做信息标志和分类
// check(0);check(Constant2.BOY);}public static void check(Constant2 sex) {switch (sex) { // 硬编码,可读性不好case BOY:System.out.println("展示男人想看的信息");break;case GIRL:System.out.println("展示女人想看的信息");break;}}
}
Constant2是一个枚举类型,里面有BOY和GIRL两个枚举对象。
然后使用枚举对象做形参。
有约束性、严谨!
对程序员也比较友好!