什么是枚举?
是一组常量的集合
1、可以理解成:枚举属于一种特殊的类,里面只包含一组有限的特定对象
设么是注解?
1.注解(Annotation)也被称为元数据(Metadata),用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息
实现枚举
自定义类实现枚举
- 将构造器私有化,防止直接
new
- 将
set
相关的方法去掉,防止属性被修改 - 在该类的内部,创建固定的对象
- 对枚举对象/属性使用
final+static
共同修饰,实现底层优化 - 枚举的对象名通常使用大写字母,常量命名规范
package enum_;
/**
* @author Zyq
* @version 1.0
*/
public class Enumeration01 {
public static void main(String[] args) {
System.out.println(Season.AUTUMN);
System.out.println(Season.SPRING);
System.out.println(Season.WINTER);
System.out.println(Season.SUMMER);
}
}
class Season {
private String name;
private String desc;//描述
//定义四个对象
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("夏天", "炎热");
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
- 常量名(实参列表)
public static final Season SPRING = new Season("春天", "温暖");
改Season("春天", "温暖");
- 如果有多个使用"
,
"间隔 - 如果使用
enum
来实现枚举,要求将定义常量对象,卸载写在最前面(语法规定)
package enum_;
/**
* @author Zyq
* @version 1.0
*/
public class Enumeration02 {
public static void main(String[] args) {
System.out.println(Season2.SPRING);
}
}
enum Season2 {
SPRING("春天", "温暖"), SUMMER("夏天", "炎热");
private String name;
private String desc;//描述
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 + '\'' +
'}';
}
}
enum实现接口
- 使用enum关键字后,就不能再继承其他类了,因为enum会隐式的继承Enum.而Java是单继承机制
- 枚举类和普通类一样,可以实现接口,形式如下
enum 类名 implements 接口1,接口2{}
深入了解枚举类型
- 当我们使用enum关键字来开发一个枚举类的时候,会默认继承enum类,而且是一个final类
枚举类型的常用方法
方法 | 含义 | 使用方法 |
values() | 将枚举类型的成员以数组的形式返回 | 枚举名.values() |
valueOf() | 可以实现将普通字符串转换枚举实例 | 枚举名.valueOf() |
compareTo() | 用来比较两个枚举对象在定义时的顺序 | 枚举名.compareTo() |
ordinal() | 得到枚举成员的顺序 | 枚举名.ordinal() |
values():
/**
* @author Zyq
* @version 1.0
*/
public class ShowEnum {
public static void main(String[] args) {
Season3[] season3 = Season3.values();
for (Season3 i : season3) {
System.out.println(i);
}
}
}
enum Season3{
AUTUMN,SPRING,WINTER,SUMMER
}
valueOf()和compareTo()方法
ordinal()
注解
- 注解(Annotation)也被称为元数据(Metadata),用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息
- 和注释一样,注解不影响程序逻辑,但是注解可以被编译或运行,相当于嵌再代码中的补充信息
- 在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE中注解占据了更重要的校色,例如用来配置应用程序的任何切面,代替Java EE旧版中所遗留的繁冗代码和XML配置。
基本的 Annotation 介绍:
在使用Annotation时要在其前面加上 @ 符号,并把该Annotation 当成一个修饰符使用,用于修饰它支持的程序元素
三个基本的Annotation:
① @Override
:限定某个方法,是重写父类方法,该注解只能用于方法 ② @Deprecated
:用于表示某个程序元素(类、方法)已经过时 ③ @SuppressWarnings
:抑制编译器警告
@Override注解
注意:写了@Override就代表重写了父类的方法,编译器会去校验是否是重写,如果发现并不是重写,那么编译器就会报错
补充说明: @interface 不是指这个是一个 interface 接口,而是一个注解类,是在jdk5.0过后才加入的
Override 使用说明: 1、@Override
表示指定重写父类的方法(可以从编译层面去验证),如果父类没有此方法,则会报错
2、如果不写 @Override
注解,但是子类中还是有父类的方法,那么仍然构成重写
3、@Override
只能修饰方法,不能修饰其他类、包、属性等
4、查看@Override
注解源码为: 说明只能修饰方法
5、@Target
是修饰注解的注解,称为元注解
@Deprecated 注解
@Deprecated
用于表示某个程序元素(类、方法)已过时
@Dprecated
** 说明:**1、用于表示某个程序元素(类、方法等)已过时
2、可以修饰:方法、类、包、字段、参数 等等
3、可以修饰以下:
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE,
METHOD, PACKAGE, PARAMETER, TYPE})
@Deprecated
的作用可以做到新旧版本的兼容和过渡
@SuppressWarnings 注解
@SuppressWarnings
:抑制编译器警告(就是代码中黄色警告
从SuppressWarnings
源码中可以看到:
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
1、可以放置的位置有: TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE
2、该注解类有数组 String[] value()
,说明可以设置一个数组,比如: @SuppressWarnings({“rawtypres”,“unchecked”,“unused”})
元注解:对注解进行解释
元注解基本介绍:
JDK 的 元注解Annotation 用于修饰其他 Annotation
元注解:本身的作用不大,但是可以让人们在看源码的时候,知道是干嘛的
元注解的种类:
① Retention
指定注解的作用范围,三种:SOURCE、CLASS、RUNTIME
② Target
指定注解可以在哪些地方使用
③ Documented
指定该注解是否惠再javadoc
中体现
④ Inherited
子类会继承父类注解
Retention注解
**说明:**只能用于修饰一个 Annotation
定义,用于指定该 Annotation
可以保留多长时间,@Retention
包含一个 RetentionPolicy
类型成员,只用 @Retention
时必须为该 value
成员变量指定值。
@Retention三种值:
Target 注解
说明:
用于修饰Annotation
定义,用于指定被修饰的 Annotation
能用于哪些程序元素,@Target
也包含一个名为 value
的成员变量
Documented 注解
说明: @Documented
用于 指定被该 元Annotation
修饰的 Annotation
类 将被 javadoc
工具提取成文档,也就是在生成文档的时候,在文档中可以看到该注解
注: 定义为Documented
的注解,必须设置 Retention
的值为 RUNTIME
(主要是要被保留在文档中)
Inherited 注解
说明:
被 @Inherited
修饰的 Annotation
将具有继承性,也就是,如果某一个类使用了被 @ Inherited
修饰的 Annotation
,则这个类的子类也将自动具有该注解