GOGOGO 枚举
含义:一种类似于类的一种结构
作用:是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;
}
@Override
public 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一起使用