1.1🍏枚举
- 季节的值是有限的几个值
- 只读,不需要修改。
- 可以这里理解:枚举属于一种特殊的类,里面只包含一组有限的特定的对象。
- 枚举对应英文(enumeration, 简写 enum)
- 枚举是一组常量的集合。
枚举的二种实现方式
- 自定义类实现枚举
- 使用 enum 关键字实现枚举
自定义类实现枚举
(1).不提供set方法,使对象只读
(2).对枚举对象使用static+final来修饰
(3).枚举对象名大写
4) 构造器私有化
public class Enumeration02 {
public static void main(String[] args) {
System.out.println(Season.SPRING);
System.out.println(Season.SUMMER);
System.out.println(Season.AUTUMN);
System.out.println(Season.WINTER);
}
}
class Season{
private String name;
// 描述
private String desc;
// 定义四个静态常量对象
// public是为了外部对象能够访问
public static final Season SPRING = new Season("春天","温暖");
public static final Season WINTER = new Season("冬天", "寒冷");
public static final Season AUTUMN = new Season("秋天", "凉爽");
public static final 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 关键字实现枚举
(1). 使用关键字 enum 替代 class
(2). 如果有多个常量(对象), 使用 ,号间隔即可
(3). 如果使用enum 来实现枚举,要求将定义常量对象,写在最前面,枚举类内部第一行
(4). 如果我们使用的是无参构造器,创建常量对象,则可以省略 ()
public class Enumeration03 {
public static void main(String[] args) {
System.out.println(Season2.AUTUMN);
System.out.println(Season2.SUMMER);
}
}
//演示使用enum关键字来实现枚举类
enum Season2 {//类
//定义了四个对象, 固定.
// public static final Season SPRING = new Season("春天", "温暖");
// public static final Season WINTER = new Season("冬天", "寒冷");
// public static final Season AUTUMN = new Season("秋天", "凉爽");
// public static final Season SUMMER = new 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 Season2() {//无参构造器
}
private Season2(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 + '\'' +
'}';
}
}
1.2🥝枚举类细节
- 当我们使用 enum 关键字开发一个枚举类时,默认会继承 Enum 类, 而且是一个 final 类,使用 javap 工具
- 传统的 public static final Season2 SPRING = new Season2(“春天”, “温暖”); 简化成 SPRING(“春天”, “温暖”), 这里必须知道,它调用的是哪个构造器.
- 如果使用无参构造器 创建 枚举对象,则实参列表和小括号都可以省略
- 当有多个枚举对象时,使用,(逗号)间隔,最后有一个分号结尾
- 枚举对象必须放在枚举类的行首.
Exercise
请问下面这样写对吗?
enum Gender{
BOY,GIRL;
}
解析
默认调用无参构造器,没有属性,有两个枚举对象
Exercise
public class EnumExercise01 {
public static void main(String[] args) {
Gender2 boy = Gender2.BOY;
Gender2 boy2 = Gender2.BOY;
System.out.println(boy);
System.out.println(boy2 == boy);
}
}
enum Gender2{
BOY , GIRL;
}
解析
1.首先调用了枚举类Gender2的BOY对象,给到了boy和boy2
2.然后这里sout(boy)就是调用Enum类的toString()方法,因为根据动态绑定机制,Gender2这个类里没有toString()方法,所以根据继承关系自然就找到了Enum类的toString()方法,看一下源码
3.sout(boy2 == boy),BOY对象是一个静态的,所以都是指向同一个BOY对象
javap反编译找到继承关系
Enum类的toString()方法就是返回name,就是枚举对象的名字
run
1.3🍐枚举类的方法
1.toString()
Season2 autumn = Season2.AUTUMN;
//输出枚举对象的名字
System.out.println(autumn.toString());
System.out.println(autumn.name());
2.ordinal() 输出的是该枚举对象的下标
System.out.println(autumn.Ordinal()); // 2
3.values() 返回一个所有枚举对象的枚举数组
先来看一下增强for循环
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
System.out.println("====普通for====");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
System.out.println("====增强for====");
for (int i : arr) {
System.out.print(i + " ");
}
}
}
分析
增强for循环是直接获取arr数组的元素后给到i,并顺序输出i
普通的for循环是通过索引获取元素再输出
这里返回所有枚举对象,放到枚举数组中,并且输出信息
Season2[] values = Season2.values();
System.out.println("====遍历取出枚举对象(增强for)====");
for (Season2 season: values) {//增强for循环
System.out.println(season);
}
4.valueOf:将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常
//执行流程
//1. 根据你输入的 "AUTUMN" 到 Season2的枚举对象去查找
//2. 如果找到了,就返回,如果没有找到,就报错
Season2 autumn = Season2.AUTUMN;
Season2 autumn1 = Season2.valueOf("AUTUMN");
System.out.println("autumn1=" + autumn1);
// 跟上面的对象,指向的都是同一对象
System.out.println(autumn == autumn1);
5.compareTo:比较两个枚举常量,比较的就是下标
System.out.println(Season2.AUTUMN.compareTo(Season2.SUMMER));
Exercise
声明Week枚举类,其中包含星期一至星期日的定义;
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
使用values 返回所有的枚举数组
public class EnumExercise02 {
public static void main(String[] args) {
Week[] weeks = Week.values();
System.out.println("====所有星期信息输出如下====");
for (Week week : weeks) {
System.out.println(week);
}
}
}
enum Week {
MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY("星期三"),
THURSDAY("星期四"), FRIDAY("星期五"), SATURDAY("星期六"), SUNDAY("星期日");
private String name;
Week(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
}
1.4🥬枚举小结
1.使用enum关键字后,就不能再继承其它类了,因为enum会隐式继承Enum,而Java是单继承机制
2.enum实现的枚举类,仍然是一个类,所以还是可以实现接口的.
public class EnumDetail {
public static void main(String[] args) {
Music.CLASSIC_MUSIC.playing();
}
}
interface IPlaying {
void playing();
}
enum Music implements IPlaying {
CLASSIC_MUSIC;
@Override
public void playing() {
System.out.println("播放好听的音乐...");
}
}
2.1🍑注解
使用 Annotation 时要在其前面增加 @ 符号, 并把该 Annotation 当成一个修饰符使用。用于修饰它支持的程序元
素
三个基本的 Annotation:
- @Override: 限定某个方法,是重写父类方法, 该注解只能用于方法
- @Deprecated: 用于表示某个程序元素(类, 方法等)已过时
- @SuppressWarnings: 抑制编译器警告
@Override 只能用在重写的方法
class Father{//父类
public void fly(){
int i = 0;
System.out.println("Father fly...");
}
public void say(){}
}
class Son extends Father {//子类
// 注解类
@Override
public void fly() {
System.out.println("Son fly....");
}
@Override
public void say() {}
}
查看源码
@Target是修饰注解的注解,称为元注解
@Target(ElementType.METHOD),说明只能用于方法中
@Deprecated
表示已经过时的
可以用在构造器,字段,局部变量,方法,包,参数,类型中
可以清除所有的警告
SuppressWarnings({“all”})