枚举
1)枚举对应英文(enumeration,简写enum) 2)枚举是一-组常量的集合。 3)可以这里理解:枚举属于-种特殊的类,里面只包含- -组有限的特定的对象。
自定义类实现枚举 。 1.不需要提供setXxx方法,因为枚举对象值通常为只读.
2.对枚举对象/属性使用final + static共同修饰,实现底层优化.
3.枚举对象名通常使用全部大写,常量的命名规范.
4.枚举对象根据需要,也可以有多个属性
package eunm;
public class Enumeration01 {
public static void main(String[] args) {
System.out.println(Season.AUTUMN);
System.out.println(Season.WINTER);
System.out.println(Season.SUMMER);
System.out.println(Season.SPRING);
}
}
//定义枚举实现
class Season {
private String name;
private String desc;
//定义了四个对象|
public static final Season SPRING = new Season("春天", "温暖");
public static Season WINTER = new Season("春天", "温暖");
public static Season AUTUMN = new Season("春天", "温暖");
public static Season SUMMER = new Season("春天", "温暖");
//1.将构造器私有化,目的防止直接new
//2.去掉setXxx方法 防止属性被修改
//3.在season内部 直接创建固定对象
//4.优化 可加入final修饰符
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + ''' +
", desc='" + desc + ''' +
'}';
}
}
enum关键字实现枚举类
- 使用关键字enum 替代cLass
- 常量名(实参列表)
3.如果有多个常量(对象),使用, 号间隔即可
4.如果使用enum实现枚举类,将定义常量对象写在前面
//enum关键字实现枚举类
enum Season {
//如果使用了enum来实现枚举类
//1. 使用关键字enum 替代cLass
//2. pubLic static final Season SPRING = new Season("春天","温暖") 直接使用
//SPRING("春天","温暖")=>常量名(实参列表)
//3.如果有多个常量(对象),使用, 号间隔即可
//4.如果使用enum实现枚举类,将定义常量对象写在前面
//5.如果使用的是无参构造器,创建常量对象 则可以省略()
SPRING("春天", "温暖"), WINTER("春天", "温暖"), AUTUMN("春天", "温暖"),
SUMMER("春天", "温暖"), What;
private String name;
private String desc;
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
private Season() {//无参构造器
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + ''' +
", desc='" + desc + ''' +
'}';
}
}
1.当我们使用enum关键字开发一 个枚举类时,默认会继承Enum类,而且是一 个 final类
2.传统的public static final Season2 SPRING = new Season2("春天", "温暖 ");简化成SPRING("春天", "温暖"), 这里必须知道,它调用的是哪个构造器
3.如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略
4.当有多个枚举对象时,使用,间隔,最后有一个分号结尾
5.枚举对象必须放在枚举类的行首.
enum常用方法应用实例(说实话这里我听的时候一脸懵逼,先记下来再说,用的时候套上)
- toString:Enum类已经重写过了 ,返回的是当前对象 名,子类可以重写该方法,用于返回对象的属性信息
- name:返回当前对象名(常量名) ,子类中不能重写
- ordinal:返回当前对象的位置号,默认从0开始
- values:返回当前枚举类中所有的常量
- valueOf:将字符串转换成枚举对象,要求字符串必须 为已有的常量名,否则报异常!
- compareTo:比较两个枚举常量,比较的就是位置号!
package eunm;
public class EnumMethod {
public static void main(String[] args) {
//使用Season2 枚举类,来演示各种方法
Season autumn = Season.AUTUMN;
//输出枚举对象的名字
System.out.println(autumn.name());
//ordinal()输出的是该枚举对象的次序/编号,从0开始编号
//AUTUMN 枚举对象是第三个, 因此输出2
System.out.println(autumn.ordinal());
//从反编译可以看出values方法, 返回Season2 [ ]
//含有定义的所有枚举对象
Season[] values = Season.values();
System.out.println("遍历取出枚举对象增强for");
//补充了一个增强for
for (Season season : values) {//增强for循环
System.out.println(season);
}
//value0f:将字符串转换成枚举对象,要求字符串必须VT为已有的常量名,否则报异常
//执行流程
//1. 根据你输入的"AUTUMN" 到Season2的枚举对象去查找
//2.如果找到了,就返回,如果没有找到,就报错
Season autumn1 = Season.valueOf("AUTUMN");
System.out.println("autumn=" + autumn1);
System.out.println(autumn == autumn1);
/*
pubLic final int compareTo(E o) {
return self .ordinal - other 。ordinal;
}
Season2。AUTUMN的编号[2] - Season2 。SUMMER的编号[3]
*/
System.out.println(Season.AUTUMN.compareTo(Season.AUTUMN));
int[] nums = {1, 3, 4};
System.out.println("普通for循环");
for (int i = 0; i < nums.length; i++) {
System.out.println(nums[i]);
}
System.out.println("增强for循环");
for (int i : nums) {
System.out.println("i=" + i);
}
}
}
//1.使用enum关键字后,就不能再继承其它类了,因为enum会隐式继承Enum, 而Java是单继承机制 //enum Season3 extends A { //} //2. enum实现的枚举类,仍然是一个类,所以还是可以实现接口的。
main中 Music.ClassicMusic.playing();
interface IPlaying{
public void playing();
}
enum Music implements IPlaying{
ClassicMusic;
@Override
public void playing() {
System.out.println("播放音乐");
}
}
注释
@Override:限定某个方法,是重写父类方法,该注解只能用于方法
@interface不是interface, 是注解类是jdk1.5之后加入的