含义:一种类似于类的一种结构
作用:是Java提供的一个数据类型,可以设置值是固定的
【当某一个数据类型受自身限制的时候,使用枚举】
语法格式:
public enum 枚举名{……
}
有哪些成员?
A、对象
public enum EnumDemo {/*** 对象** 对象是直接在枚举类中* 全大写默认是对象* 底层语法格式默认 public static final 枚举名 对象名 = new 枚举名();* 默认调用的无参构造* 定义多个对象时以逗号隔开分号结尾 对象1,对象2,对象3,对象4……;*/UPPER;
}
如何调用对象?
public class EnumDemoTest {public static void main(String[] args) {//直接打印输出 【枚举名.对象名】 默认打印结果是对象名System.out.println(EnumDemo.UPPER);//UPPER}
}
注意:这里打印的对象不是地址,默认打印对象名,因为其实它默认重写了toString方法,手动重写会打印对象构造方法中的值
B、字段【非静态和静态】
前提:从上自下,先有对象,再有字段;有字段无对象会编译错误
public enum EnumDemo {/*** 字段** 1.数据类型 字段名;** 2.static 数据类型 字段名;*/UPPER;String centre;static String centre1;
}
如何调用字段?
public class EnumDemoTest {public static void main(String[] args) {//调用非静态字段【枚举名.对象名.非静态字段名】EnumDemo.UPPER.centre = "aa";System.out.println(EnumDemo.UPPER.centre);//aa//调用静态字段【枚举名.静态字段名】EnumDemo.centre1 = "AA";System.out.println(EnumDemo.centre1);//AA}
}
C、构造方法
默认都是 私有的
public enum EnumDemo {/*** 构造方法** 1.无参构造** 2.有参构造【直接此枚举对象中 对象名("字段类型值")】** 对象默认使用无参** 当有了有参构造,也必须要有无参构造**/UPPER,UPPER1("!"),UPPER2("!",100);String centre;static String centre1;//默认构造方法被private修饰,也只能用它来修饰EnumDemo(){System.out.println("无参构造!");}EnumDemo(String name){System.out.println("有参构造"+name);}EnumDemo(String name,int morey){System.out.println("有参构造"+name+"--"+morey);}}
如何调用构造方法?
public class EnumDemoTest {public static void main(String[] args) {//调用无参构造EnumDemo upper = EnumDemo.UPPER;//就是这样就会打印:无参构造!//调用有参构造(形参列表个数1)EnumDemo upper1 = EnumDemo.UPPER;//就是这样就会打印:有参构造!//调用有参构造(形参列表个数2……)EnumDemo upper2 = EnumDemo.UPPER;//就是这样就会打印:有参构造!--100}
}
由此可以看出,每个对象都能共享枚举里面的其它成员
这里重写toString方法呢?
public enum EnumDemo {/*** 构造方法** 1.无参构造** 2.有参构造【直接此枚举对象中 对象名("字段类型值")】** 对象默认使用无参** 当有了有参构造,也必须要有无参构造**/UPPER,UPPER1("!"),UPPER2("!",100);String name;int morey;static String centre1;//默认构造方法被private修饰,也只能用它来修饰EnumDemo(){System.out.println("无参构造!");}EnumDemo(String name){System.out.println("有参构造"+name);}EnumDemo(String name,int morey){//给set/get方法、toString方法this.name = name;this.morey = morey;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getMorey() {return morey;}public void setMorey(int morey) {this.morey = morey;}public static String getCentre1() {return centre1;}public static void setCentre1(String centre1) {EnumDemo.centre1 = centre1;}@Overridepublic String toString() {return "EnumDemo{" +"name='" + name + '\'' +", morey=" + morey +'}';}
}
/*** 调用 UPPER2对象 有参构造*/
public class EnumDemoTest {public static void main(String[] args) {//调用无参构造EnumDemo upper = EnumDemo.UPPER;//就是这样就会打印:无参构造!//调用有参构造(形参列表个数1)EnumDemo upper1 = EnumDemo.UPPER;//就是这样就会打印:有参构造!//调用有参构造(形参列表个数2……)EnumDemo upper2 = EnumDemo.UPPER2;System.out.println(upper2);//EnumDemo{name='!', morey=100}}
}
D、方法
public enum EnumDemo {/*** 方法** 1.非静态方法** 2.静态方法*/UPPER;void method1(){System.out.println("非静态方法!");}static void method2(){System.out.println("静态方法!");}
}
如何调用方法?
public class EnumDemoTest {public static void main(String[] args) {//调用非静态方法【对象名.对象名.非静态方法】EnumDemo.UPPER.method1();//非静态方法!//调用静态方法【枚举名.静态方法名】EnumDemo.method2();//静态方法!}
}
枚举的继承
(Enum)是所有枚举类的基类,都隐式继承了Enum,只能隐式继承,不能显示继承
为何打印对象的时候不是直接打印的地址而是打印的对象名?
java.lang.Object 【所有类的基类,toString方法】└ java.lang.Enum<E> 【所有枚举类的基类】【因为Enum继承了Object类,重写了toString方法】└ 自定义的枚举类 【所以打印对象是其对象名,而不是地址】
使用场景
一般使用在值比较固定的地方,常和switch一起使用