Java学习笔记——新特性-枚举

Java学习笔记——新特性-枚举

1 自定义枚举类

class Season implements Info{
	//1. 类的属性,声明为private final,因为枚举类对象的属性不应允许被改动
	private final String name;
	private final String desc;
	//2. 声明为final的属性,在构造器中初始化
	private Season(String name, String desc) {
		super();
		this.name = name;
		this.desc = desc;
	}
	public String getName() {
		return name;
	}
	public String getDesc() {
		return desc;
	}
	//4.创建枚举类的对象:将类的对象声明为public static final。可重写类中的方法。
	public static final Season SPRING = new Season("spring", "春暖花开") {
		public void show(){
			System.out.println("春天在哪里?");
		}
	};
	public static final Season SUMMER = new Season("summer", "夏日炎炎") {
		public void show(){
			System.out.println("生如夏花");
		}
	};
	public static final Season AUTUMN = new Season("autumn", "秋高气爽") {
		public void show(){
			System.out.println("秋天是用来分手的季节");
		}
	};
	public static final Season WINTER = new Season("winter", "白雪皑皑") {
		public void show(){
			System.out.println("冬天里的一把火");
		}
	};	
	
	@Override
	public String toString() {
		return "Season [name=" + name + ", desc=" + desc + "]";
	}
	
	// 必须实现接口中的所有方法
	@Override
	public void show() {
		System.out.println("这是一个季节");
	}
}

interface Info{
	void show();
}

核心在于将属性用final修饰(属性可选),将构造器用private,并且其成员中有若干个 public static final 的对象

public class TestSeason {
	public static void main(String[] args) {
		Season spring = Season.SPRING;
		Season summer = Season.SUMMER;
		Season autumn = Season.AUTUMN;
		Season winter = Season.WINTER;
		System.out.println(spring);
		spring.show();
		System.out.println(summer);
		summer.show();
		System.out.println(autumn);
		autumn.show();
		System.out.println(winter);
		winter.show();
	}
}

2 使用enum定义枚举类

enum SeasonEnum implements Info{
	// 枚举对象必须在一开始声明,并且可以省略掉一些重复的修饰符
	SPRING("spring", "春暖花开"){
        @Override
		public void show(){
			System.out.println("春天在哪里?");
		}
	},
	SUMMER("summer", "夏日炎炎"){
        @Override
		public void show(){
			System.out.println("生如夏花");
		}
	},
	AUTUMN("autumn", "秋高气爽"){
		@Override
		public void show() {
			System.out.println("秋天是用来分手的季节");
		}
	},
	WINTER("winter", "白雪皑皑"){
		@Override
		public void show() {
			System.out.println("冬天里的一把火");
		}
	};
    
	private final String name;
	private final String desc;
	
	private SeasonEnum(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 + "]";
	}
	
	// 当所有枚举对象都实现了接口中的方法,则枚举类中不必实现
//	@Override
//	public void show() {
//		System.out.println("这是一个季节");
//	}
	
}

使用enum关键字进行定义枚举类,则可以省略一些重复的代码,使代码更简洁。

枚举类和普通类的区别:

  • 枚举对象值必须在一开始就声明,并且以 ‘,’ 分隔,以 ‘;’ 结尾
  • 枚举类的构造器只能使用 private 访问控制符
  • 若所有的枚举对象都实现了接口中的方法,则枚举类中不必实现(即若枚举类中没有实现接口中的方法,则必须在所以枚举对象中实现)
  • 若枚举类存在无参构造器,则声明枚举对象时可以省略括号
  • 存在一些已经事先定义好的方法

一个更简单的例子:

// Java源代码中Thread中的一个内部类State
public enum State {
    NEW,
    RUNNABLE,
    BLOCKED,
    WAITING,
    TIMED_WAITING,
    TERMINATED;
}

JDK 1.5 中可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式,case 子句可以直接使用枚举值的名字,无需添加枚举类作为限定。

3 枚举类的主要方法

  • values()

    返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。

    SeasonEnum[] seasons = SeasonEnum.values();
    for (int i = 0; i < seasons.length; i++) {
        System.out.println(seasons[i]);
    }
    
  • valueOf(String str)

    可以把一个字符串转为对应的枚举类对象。要求传入的字符串必须是枚举类对象的“名字”。如不是,会有运行时异常。

    SeasonEnum season = SeasonEnum.valueOf("SPRING");
    System.out.println(season);
    
    // 其他方法
    System.out.println(season.name()); // 得到当前枚举常量的名称
    System.out.println(season.ordinal()); // 得到当前枚举常量的次序
    

以上笔记参考自尚硅谷

猜你喜欢

转载自blog.csdn.net/Runner1st/article/details/87519740
今日推荐