一、枚举
1.基本介绍
枚举(enum):枚举是一组常量的集合,枚举属于一种特殊的类,里面只包含一组有限的特定的对象
2.实现方式
自定义类实现枚举
使用步骤
- 第一步:构造器私有化,防止直接new
- 第二步:不能有set方法,防止修改(只读)
- 第三部:在类的内部直接创建固定的对象
注意事项
- 对枚举对象/属性使用final+static共同修饰,实现底层优化(对外暴露对象)
- 枚举对象名通常使用全部大写
- 枚举对象根据需求也可以有多个属性
快速入门
public class test1 {
public static void main(String[] args) {
System.out.println(Season.SPRING);
System.out.println(Season.WINTER);
System.out.println(Season.AUTUMN);
System.out.println(Season.SUMMER);
}
}
class Season{
private String name;
private String desc;
//创建固定的对象,static暴露对象
public final static Season SPRING = new Season("春天","温暖");
public final static Season WINTER = new Season("冬天","寒冷");
public final static Season AUTUMN = new Season("秋天","凉爽");
public final static 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关键字实现枚举
注意:枚举属于一种特殊的类
使用步骤
- 第一步:把class关键字换成enum关键字
- 第二步:构造器私有化,且不能有set方法
- 第三步:创建枚举对象,直接 对象名(实参列表),如果有多个,写在一行中间用逗号隔开
- 第四步:将枚举对象放在首行
注意事项
- 当我们使用enum关键字开发一个枚举类时,默认会继承Enum类,而且是一个final类
- 在创建枚举对象时,必须知道它调用的是那个构造器
- 如果使用无参构造器创建枚举对象,则可以省略括号
- 当有多个枚举对象时,中间使用逗号隔开
- 枚举对象必须方法枚举类的首行
- 使用 enum 关键字后,就不能再继承其它类了,因为 enum 会隐式继承 Enum,而 Java 是单继承机制
- 枚举类和普通类一样,可以实现接口 如:enum 类名 implements 接口 1,接口 2{}
public class test1 {
public static void main(String[] args) {
System.out.println(Season.SPRING);
System.out.println(Season.WINTER);
System.out.println(Season.AUTUMN);
System.out.println(Season.SUMMER);
}
}
interface A{}
interface B{}
enum Season implements A,B{
//枚举对象对象,中间用逗号间隔,且必须放在枚举类首行
SPRING("春天","温暖"),WINTER("冬天","寒冷"),
AUTUMN("秋天","凉爽"),SUMMER("夏天","炎热"),WCGZ;//最后是一个无参构造器
private String name;
private String desc;
//无参构造器
private Season(){
System.out.println("无参构造方法!");
}
//构造器私有化
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 Person{
RUN,SPEAK;
}
解析:
1.Person是一个枚举类,它没有属性
2.有两个枚举类对象RUN和SPEAK,都调用了无参构造器
3.enum的成员方法
使用关键字enum时,会隐式继承Enum类,这样我们就可以使用Enum类相关的方法
方法名 | 功能描述 |
---|---|
toString | 子类可以重写该方法,用于返回对象的属性信息 |
name | 返回当前对象名(常量名),子类中不能重写 |
ordinal | 返回当前对象的位置号,默认从 0 开始 |
values | 返回当前枚举类中所有的常量 |
valueOf | 将字符串转换成枚举对象,要求字符串必须 为已有的常量名,否则报异常! |
compareTo | 比较两个枚举常量,比较的就是编号 |
public class test1 {
public static void main(String[] args) {
Season winter = Season.WINTER; //枚举对象
//toString方法
System.out.println(winter.toString());
System.out.println("==============================");
//name方法
System.out.println(winter.name());
System.out.println("==============================");
//ordinal方法
System.out.println(winter.ordinal());
System.out.println("==============================");
//values方法
Season[] values = Season.values();
for (Season season : values) { //增强for循环
System.out.println(season);
}
System.out.println("==============================");
//valueOf方法,从Season去寻找有没有SPRING这个枚举对象
//如果有,返回该枚举对象,如果没有,则报错
System.out.println(Season.valueOf("SPRING"));
// System.out.println(Season.valueOf("aaaaaa")); //报错:No enum constant com.test.Season.aaaaaa
//compareTo方法的值为 源码:return self.ordinal - other.ordinal;
System.out.println("==============================");
System.out.println(winter.compareTo(Season.SUMMER)); //-2
System.out.println(winter.compareTo(Season.SPRING)); //1
}
}
enum Season{
//枚举对象对象,中间用逗号间隔,且必须放在枚举类首行
SPRING("春天","温暖"),WINTER("冬天","寒冷"),
AUTUMN("秋天","凉爽"),SUMMER("夏天","炎热");//最后是一个无参构造器
private String name;
private String desc;
//构造器私有化
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
//重写了Enum中的toString方法
// @Override
// public String toString() {
// return "Season{" +
// "name='" + name + '\'' +
// ", desc='" + desc + '\'' +
// '}';
// }
}
二、注解
1.基本介绍
注解(Annotation):也被称为元数据(Metadata),用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息。和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。
在 JavaSE 中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在 JavaEE 中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替 java EE 旧版中所遗留的繁冗代码和 XML 配置等。
使用注解(Annotation)时要在前面加 @ 符号, 并把该 Annotation 当成一个修饰符使用。用于修饰它支持的程序元素
2.三个基本的Annotation
名称 | 功能 |
---|---|
@Override | 限定某个方法,是重写父类方法, 该注解只能用于方法 |
@Deprecated | 用于表示某个程序元素(类, 方法等)已过时 |
@SuppressWarnings | 抑制编译器警告 |
(1)@Override的使用
interface A{
void test();
}
class B implements A{
@Override
public void test() {
System.out.println("重写了接口的抽象方法");
}
}
@Target是修饰注解的注解,称为元注解
(2)@Deprecated的使用
public class test1 {
public static void main(String[] args) {
A a = new A(); //在IDEA开发工具中A中间就会有一个下划线
a.test(); //test中间也会有一个下划线
}
}
@Deprecated //表示该元素已经过时,但是不代表不能用
class A{
@Deprecated
public void test(){
System.out.println("AAA");
}
}
(3)@SuppressWarnings的使用
格式
@SuppressWarnings{“”} //引号中写入需要抑制的警告,可以写多个 中间用逗号隔开
示例:
@SuppressWarnings{“null”,“unused”} 表示抑制空值和不被使用变量的警告
@SuppressWarnings{“all”} 表示抑制所有警告
还有很多就不一 一演示了
public class test1 {
public static void main(String[] args) {
A a = new A();
a.test();
}
}
class A{
@SuppressWarnings("unused")
int a = 1; //当a没有被使用时会出现一个警告提示,写上面的注解可以抑制这种警告
public void test(){
System.out.println("AAA");
}
}
3.元注解
元注解本身作用不大,主要用于看注解的源码,了解一下什么意思即可
基本介绍
JDK的元注解用于修饰其他注解
名称 | 功能 |
---|---|
@Retention | 指定注解的作用范围,三种 SOURCE,CLASS,RUNTIME |
@Target | 指定注解可以在哪些地方使用 |
@Documented | 指定该注解是否会在 javadoc 体现 |
@Inherited | 子类会继承父类注解 |
下图表示的是@Override重写注解的一个源码