第11章:枚举和注解
总内容
引申:自动生成作者和版本
枚举
引出枚举
- 传统方式会出现问题
属性 + 构造器 + get、set方法 + 在main方法中实例化
- 分析问题
- 解决问题
枚举两种实现方式
第一种:自定义枚举类
步骤
细节及代码
小结
第二种:enum枚举类
步骤
细节1
javap 反编译
反编译发现继承了Enum类
细节2
用enum实现枚举的代码
/**
* @author 王胖子
* @version 1.0
*/
public class Excise {
public static void main(String[] args) {
System.out.println(Season.SPRING);
}
}
enum Season{
//; 只写分号表示枚举类为空
SPRING("春天","温暖"),WINTER("冬天","寒冷"),
SUMMER("夏天","炎热"),AUTUMN("秋天","凉爽");
private String name;
private String desc;//描述
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成员方法
5.1 常用方法
5.2 讲解常用的方法
5.3 代码演示
补充增强for循环和普通for循环的对比(在代码最下面演示了)
public class Excise {
public static void main(String[] args) {
//使用Season 枚举类,来演示各种方法
Season autumn = Season.AUTUMN;
//1. 输出枚举对象的名字
System.out.println("1. autumn.name() = " + autumn.name());
//2. ordinal()输出的是该枚举对象的次序或编号,从0开始编号
System.out.println("1. autumn.ordinal() = " + autumn.ordinal());
//3. 从反编译可以看出,values方法,返回的是Season[]
//含有定义的所有枚举对象
Season[] values = Season.values();
System.out.println("====Season.values()返回一个枚举对象的数组====");
System.out.println("=====遍历取出枚举对象(增强for循环)=====");
for (Season season : values) {//增强for循环
//执行流程是:依次从nums数组中取出数据,赋给i,如果取出完毕,则退出for
System.out.println(season);
}
//4. valueOf:将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常
//执行流程:
//① 根据输入的"Autumn" 到 Season的枚举对象区查找
//② 如果找到了,就返回,如果没找到,就报错
Season autumn1 = Season.valueOf("AUTUMN");
System.out.println("Season.valueOf(\"AUTUMN\") = " + autumn1);
System.out.println(autumn == autumn1);//true
//5.compareTo:比较两个枚举常量,比较的是编号
//解读:
//就是把Season.SPRING枚举对象的编号和Season.SUMMER枚举对象的编号比较
// public final int compareTo(E o) {
// Enum<?> other = (Enum<?>)o;
// Enum<E> self = this;
// if (self.getClass() != other.getClass() && // optimization
// self.getDeclaringClass() != other.getDeclaringClass())
// throw new ClassCastException();
// return self.ordinal - other.ordinal;
// }
System.out.println("Season.SPRING.compareTo(Season.SUMMER) = " +
Season.SPRING.compareTo(Season.SUMMER));//返回的是int -> -3
// 补充增强for循环和普通for循环的对比
// for (Season season:values) {
// System.out.println(season);
// }
// for (int i = 0; i < values.length; i++) {//传统for循环
// System.out.println(values[i]);
// }
}
}
enum Season {
//; 只写分号表示枚举类为空
SPRING("春天", "温暖"), WINTER("冬天", "寒冷"),
SUMMER("夏天", "炎热"), AUTUMN("秋天", "凉爽");
private String name;
private String desc;//描述
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 + '\'' +
'}';
}
}
输出
JDK内置的基本注解类型
注解的理解
三个基本的Anotation
@Override重写父类方法
@Deprecated某元素已过时
@SuppressWarnings抑制编译器警告
元注解(了解即可)
- 基本介绍
- @Retention(注解可以保留多久)
- @Target(能用于修饰哪些程序元素)
- @Documented(生成文档时,可以看到该类的注释)
- @Inherited(子类自动具有该注解)
本章作业(枚举类)
枚举值的 switch使用
- switch的 () 中,放入枚举对象
switch (yellow)
- 在每个case后,直接写上在枚举类中定义的枚举对象即可
case Black:
枚举类中放着枚举类的对象
Color yellow = Color.Yellow;//引用枚举类对象
yellow.show();//枚举类对象调用枚举类中的方法
/**
* @author 王胖子
* @version 1.0
*/
public class Excise {
public static void main(String[] args) {
//Yellow是枚举类中的对象
Color yellow = Color.Yellow;
yellow.show();
//演示枚举值的 switch使用
//switch的 () 中,方法枚举对象
//在每个case后,直接写上在枚举类中定义的枚举对象即可
switch (yellow) {
case Black:
System.out.println("匹配到黑色");
break;
case Yellow:
System.out.println("匹配到黄色");
break;
default:
System.out.println("未匹配到");
break;
}
}
}
//接口
interface ShowColor {
public void show();
}
//枚举类
enum Color implements ShowColor {
//这些是枚举类中的对象
Red(255, 0, 0), Blue(0, 0, 255),
Yellow(255, 255, 0), Black(0, 0, 0),
Green(0, 255, 0);
private int redValue;
private int greenValue;
private int blueValue;
Color(int redValue, int greenValue, int blueValue) {
this.redValue = redValue;
this.greenValue = greenValue;
this.blueValue = blueValue;
}
@Override
public void show() {
System.out.println("redValue = " + redValue + "\ngreenValue = " +
greenValue + "\nblueValue = " + blueValue);
}
}