枚举类(普通类)
(一)枚举类的实质
1.枚举类是不允许随便构建对象的
2.枚举类内部会把自己这个类可以产生的对象提前产生,并且以变量形式放置到类的第一行。
3.有一个类,里面的类型相对是固定的,这时候就可以将其设置为枚举类
(二)枚举类的书写规则
public enum className{
//必须是第一行,把由这个类构建的对象列举出来
//属性
//方法
//构造器(必须私有化)
}
public enum TrafficSign{} // 是下面形式的简写形式
public final TrafficSign extends Enum{ } //所以枚举类是无法再继承其他父类
/*
* enum TrafficSign{} 是下面形式的简写形式
* public final TrafficSign extends Enum{ }
* 枚举类是无法在继承其他父类
*/
enum TrafficSign{
//第一行必须为由这个类产生的对象
/*
* final static RED = new TrafficSign("");
* final static YELLOW = new TrafficSign("");
* final static GREEN = new TrafficSign("");
*/
RED,YELLOW,GREEN;
//属性
public String color;
//方法
public void rule() {
System.out.println("红灯停,绿灯行,黄灯等一等");
}
//私有构造器
private TrafficSign() {
System.out.println("无参构造器被调用");
}
private TrafficSign(String color) {
this.color = color;
System.out.println("有参构造器被调用");
}
}
(三)枚举类的特性
(1)不能继承其他类,因为继承了Enum类,但是可以实现其他若干个接口
1).直接在类中把接口中的方法实现;枚举类中的对象都是用的同一套方法的实现
2).构建每个对象的时候,在对象中对方法进行实现;
/*
* final class Color extends Enum implements ColorInterface
*/
enum Color implements ColorInterface{
//如果每个对象的实现方式不一样的话就可以使用这种方式:
//构建每个对象的时候,把每个接口中的方法分别实现,
RED("red"){
@Override
public void test() {
System.out.println("red");
}
},GREEN("green"){
@Override
public void test() {
}
},BLUE(){
@Override
public void test() {
}
};
public void getColor(int num1,int num2) {
System.out.println(num1+num2);
}
//将接口中的方法在类中进行统一的实现
@Override
public void test() {
System.out.println("test=========");
}
@Override
public void test1(int num1, int num2, int num3) {
System.out.println(num1+num2+num3+"============");
}
private Color() {
}
private Color(String color) {
}
}
interface ColorInterface{
public void test();
public void test1(int num1,int num2,int num3);
}
(2)枚举类中也可以有抽象方法,但是由于枚举类实质是由final修饰的类,不能有子类,所以我们声明了抽象方法之后,必须在枚举类中对抽象方法进行实现。
//枚举类;抽象方法的声明
enum Gender{
MAN(){
@Override
public void test(int a, int b) {
System.out.println("test===man====挣钱"+(a+b));
}
},WOMAN(){
@Override
public void test(int a, int b) {
System.out.println("woman 天天花钱"+(a+b));
}
};
public abstract void test(int a,int b);
}
(四)获取枚举类对象的三种方式
(1)由于枚举类对象是public final static修饰的,所以可以直接使用 类名.对象 的方式获取
TrafficSign a = TrafficSign.RED;
(2)使用从父类Enum继承下来的 valueOf("对象") 方法获取枚举类对象
TrafficSign sign = TrafficSign.valueOf("GREEN");
sign.rule();
(3)使用从父类Enum继承下来的values()方法获取所有的枚举类对象
TrafficSign[] dengs = TrafficSign.values();
for(int i=0;i<dengs.length;i++) {
System.out.println(dengs[i]);
}
(五)通过反编译查看枚举类的源码:
(1)使用jdk自带的反编译工具
javap -p TrafficSign.class(2)将枚举类进行反编译,查看枚举类的代码,可知:
1.枚举类是final修饰的并继承了Enum类
2.枚举类的对象是 public static final修饰的
3.枚举类中还有从父类继承下来的values()方法和valueOf()方法
final class com.briup.day16.TrafficSign extends java.lang.Enum<com.briup.day16.TrafficSign> {
public static final com.briup.day16.TrafficSign RED;
public static final com.briup.day16.TrafficSign YELLOW;
public static final com.briup.day16.TrafficSign GREEN;
public java.lang.String color;
private static final com.briup.day16.TrafficSign[] ENUM$VALUES;
static {};
public void rule();
private com.briup.day16.TrafficSign(java.lang.String, int);
private com.briup.day16.TrafficSign(java.lang.String, int, java.lang.String);
public static com.briup.day16.TrafficSign[] values();
public static com.briup.day16.TrafficSign valueOf(java.lang.String);
}