引入

Season spring = new Season("春天","温暖");
        Season winter = new Season("冬天","寒冷");
        Season autumn = new Season("秋天","凉爽");
        Season summer = new Season("夏天","炎热");
/**
 *这样不能体现季节是固定的四个对象
*如何让别人不能修改你的类呢?
*例如别人Season whiter = new Season(...)
 *因此,这样的设计不好,所以可以用枚举类
*/

自定义

public class Enumeration01 {
    public static void main(String[] args) {
        System.out.println(Season.AUTUWN);
    }
}
//演示自定义枚举实现

class Season{
    private String name;
    private String desc;
    final public static SeasonSPRING= new Season("春天","温暖");
    final public static SeasonWINTER= new Season("冬天","寒冷");
    final public static SeasonAUTUWN= new Season("秋天","凉爽");
    final public static SeasonSUMMER= new Season("夏天","炎热");
    //1.构造器私有化,防止被new出来
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
    //2.去掉set相关的方法,防止属性被修改,不过可以提供get
    //3.在Season类内直接创建固定的对象
    //4.final static修饰,优化
}

emun

package _enum;

/**
 *
 */
public class Enumeration01 {
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
    }
}
//演示自定义枚举实现

enum Season{
SPRING("春天","温暖"),WINTER("冬天","寒冷");
    //1.用关键字enum来实现枚举类
    //2。直接用SPRING("","");
    //3.如果有多个常量对象,用逗号间隔
    //4.如果用enum,常量对象要写在最前面。
		//5.如果使用的是无参构造器创建常量对象,则可以省略小括号
    private String name;
    private String desc;
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

}

(base) wendy@WendydeMacBook-Pro javalesson2 % javap out/production/javalesson2/_enum/Season.class
Compiled from "Enumeration01.java"
final class _enum.Season extends java.lang.Enum<_enum.Season> {
  public static final _enum.Season SPRING;
  public static final _enum.Season WINTER;
  public static _enum.Season[] values();
  public static _enum.Season valueOf(java.lang.String);
  static {};
}

Untitled

默认调用无参构造器,但是第二个因为没有无参构造器了,所以不行的

Untitled

BOY、GIRL是static的,所以boy、boys指向的是同一个

Untitled

//测试这些方法
package _enum;

public class E2 {
    public static void main(String[] args) {
        //toString被重写了,返回他的名字
        System.out.println(Gender.BOY);
        Gender boy = Gender.BOY;
        Gender boy2 = Gender.BOY;
        //BOY是静态的,因此是同一个
        System.out.println(boy==boy2);
        //输出它对应的值,0,1,2……跟定义顺序有关
        System.out.println(Gender.BOY.ordinal());
        //把所有的枚举量放在一个数组里
        Gender[] values = Gender.values();
        for(Gender gender:values){
            System.out.println(gender);
        }
        //字符串->枚举量
        Gender man = Gender.valueOf("BOY");
        System.out.println("++++++++");
        System.out.println(man);
        //他的ordinal作差
        System.out.println(boy.compareTo(Gender.HI));
        System.out.println(boy.compareTo(Gender.GIRL));
    }
}

enum Gender{
BOY,GIRL,HI;
}

enum Gender2{
BOY,GIRL;
}

enum实现接口的

但是enum不能继承其他类了,因为已经继承了一个类!

@Override
如果写了这个方法,那么编译器就会去检查,如果重写了,则编译通过,如果没构成重写,则编译错误