认识枚举:
枚举是一种特殊的类。
枚举类的格式:
说明:
第一行是罗列枚举的对象名称。只能写合法的标识符(名称),多个名称用逗号隔开。
这些名称本质上都是常量,每个变量都会记住枚举类的一个对象。
第二行:可以是类的五大成员。
反编译的情况,我们看到有一个私有的构造器:
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);
// 枚举类提供了一些额外的API
A[] 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() { // 构造器
@Override
public void go() { // 构建对象的时候,重写go方法
}
},
Y("张三") {
@Override
public 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两个枚举对象。
然后使用枚举对象做形参。
有约束性、严谨!
对程序员也比较友好!