24-07-24 java枚举与注解详解
文章目录
初步认识枚举类
在我们以前OOP的学习中,我们熟练的掌握了一些类与对象之间的相关知识,并且能够灵活的创建各种各样的对象,但是我们似乎忽略了一个问题,无论是从生活常识还是命名规范上来讲,有些类的对象不能够随便创建,甚至个数都有严格要求,例如season季节类只能有4个对象,春夏秋冬,所以我们需要一种类来帮助我们更好地枚举出这些对象,这这种类就叫做枚举类(enumeration)。
枚举类的定义-自定义枚举类
枚举类是一种特殊的类,它是一组常量的集合,为什么这么说呢,因为枚举类包含的是一组有限的对象,简单来说就是直接在类中定义对象,而不通过构造函数,所以我们需要把构造函数给私有化,而为了防止对象的属性被篡改,保证对象的只读属性,我们需要同样需要删除或者私有化set方法,最后,为了底层实现更加快捷高效,我们在对象前面加上static final,我们要让对象作为枚举类的接口,因此需要把对象公开,前面需要加上public。
还有需要注意的是,因为这个对象是只读的,所以它是一个常量,根据命名规范,名称全部大写。
public class Enumeration {
public static void main(String[] args) {
Season.SPRING.say();
}
}
class Season {
public String season;
public String des;
private Season(String season, String des) {
this.season = season;
this.des = des;
}
public void say() {
System.out.println(season+des);
}
public static final Season SPRING = new Season("春天","温暖");
public static final Season SUMMER = new Season("夏天","炎热");
public static final Season AUTUMN = new Season("秋天","凉爽");
public static final Season WINTER = new Season("冬天","寒冷");
}
枚举类的定义-使用enum关键字
我们可以使用enum关键字来创建枚举类,如下把原先的class换成enum,创建对象方面采用常量名(参数列表)的方式实现,注意需要写在构造函数与定义变量前面(一般放在开头),如果要定义多个常量对象,不能另起一行,要用逗号分隔开,构造函数可以省略访问修饰符,因为enum类中默认private。我们重载toSTring方法来更好的输出。
public class Enumeration {
public static void main(String[] args) {
System.out.println(Season.SPRING);
}
}
enum Season {
SPRING("春天","温暖"),SUMMER("夏天","炎热")
,AUTUMN("秋天","凉爽"),WINTER("冬天","寒冷");
public final String season;
public final String des;
Season(String season,String des) {
this.season = season;
this.des = des;
}
@Override
public String toString() {
return "Season{" +
"season='" + season + '\'' +
", des='" + des + '\'' +
'}';
}
}
enum关键字实现枚举的注意事项
其实当我们使用enum关键字实现一个枚举类时候,默认会继承Enum类,构造函数默认private,成员变量默认final,这一切该如何证明呢。
我们都知道,java文件通过javac命令编译为class文件才能运行,反过来,class文件也可以反编译为java文件。
我们打开对应类class文件目录输入cmd进入控制台
输入javap Season.class命令,如下图
我们可以看到这个枚举类的真面目,它是继承自java.lang.Enum的,而且它的常量对象全是public static final修饰。
从传统的public static final Season SPRING = new Season(“春天”,“温暖”);到SPRING(“春天”,“温暖”);代码量大大简化,顺道一说,如果调用的构造函数是无参的话,常量对象后面的小括号设置都可以不用写。
SPRING1,SUMMER,AUTUMN,WINTER;
public String season;
public String des;
Season() {
}
枚举对象一定要放在行首。
enum常用方法
刚刚我们说了,使用enum关键字时候会隐式地继承Enum类,使用我们也可以在enum类中使用Enum中的相关方法。
调用方法如下:
结果如下:
如果有不清楚的我们也可以按下ctrl+B查看函数源码。
enum实现接口
-
使用enum关键字以后,就不能再继承其他类了,因为enum会隐式的继承Enum,而java是单继承机制。
-
与普通类一样,枚举类也可以实现接口。
interface IT {
void say();
}
enum ITT implements IT {
III;
@Override
public void say() {
System.out.println("我要学好java");
}
}
认识注解
注解(Annotation)也被我们称为元数据,用于修饰包,类,方法。属性,构造器,局部变量等数据信息。与注释不同的是,注释不会被编译器编译,但是注解会被编译器编译。
一般来说,我以下三种注解最为常用:
- @override
- @deprecated
- s
@override
class father {
public void say() {
}
}
class son extends father {
@Override
public void say() {
super.say();
}
}
可能有人会奇怪,就算不写@override应该也没问题呀,没错,但是这是在你继承成功的情况下,也就是你写对的情况下,如果我们的继承方法是像下面这样的
class son extends father {
public void sa() {
super.say();
}
}
哈哈,编译器也不会报错,但是我们没有成功继承say方法,所以呢,@override是为了帮我们检查是否继承成功,如果我们这个时候加了@override。
编译器可以立刻提示我们写错了,从而预防错误的发生。
还有需要注意的是,@override只能修饰方法,如果我们在@override初按下ctrl+B,我们可以看到@override的实现原理。
其中,@interface表示一个注解类而不是一个接口,@Targe是修饰注解的注解,称为元注解。
@Deprecated
@Deprecated用于表示某个程序已经过时,不推荐使用,但是不推荐不代表不能用,如果我们调用了一个过时的方法,编译器会提示我们不推荐使用,但是可能还是可以运行的。
如果我们进入@Deprecated的源码。
我们可以知道@Deprected的使用地方包括方法,类,字段,包,参数等。
@SuppressWarnings
在我们编写代码的过程中,我们时不时会遇到警告信息。
那么我们如何忽略这些警告呢,我们可以使用@SuppressWarnings。
对应不同类型的警告,我们可以使用不同的@SuppressWarnings来忽略它们,也可以直接使用all忽视所有警告。
此外,@SuppressWarnings也有很大讲究,如果我们把它放在类前,就可以全局作用,当然也可以在特定的方法前消除警告。
进入@SuppressWarnings源码
链图片转存中…(img-LGv3vuU5-1721916341888)]
此外,@SuppressWarnings也有很大讲究,如果我们把它放在类前,就可以全局作用,当然也可以在特定的方法前消除警告。
[外链图片转存中…(img-4nftfaEX-1721916341889)]
进入@SuppressWarnings源码
[外链图片转存中…(img-tUdTTnwO-1721916341889)]
我们可以看到@SuppressWarnings的作用域为TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE。
讲解完毕,欢迎补充