Java学习-关于枚举、注解的笔记整理
程序员文章站
2024-03-08 16:46:40
...
枚举与注解
枚举
枚举用于定义有限数量的一组同类常量,例如:
一年四季:春、夏、秋、冬
发生错误的级别:低、中、高、紧急
枚举是可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
定义格式:
权限修饰符 enum 枚举名称{
实例1,实例2,实例3;
}
示例:
//错误级别
public enum Level{
LOW(10),MEDIUM(30),HIGH(60),URGENT(100);
private int levelvalue;
private Level(int levelvalue){
this.levelvalue=levelvalue;
}
public int getLevelvalue(){
return levelvalue;
}
}
Enum抽象类常见方法:
Enum是所有Java语言枚举类型的公共基本类(注意Enum是抽象类),以下是它的常见方法:
返回类型 | 方法名称 | 方法说明 |
---|---|---|
int | compareTo(E o) | 比较此枚举与指定对象的顺序 |
boolean | equals(Object other) | 当指定对象等于此枚举常量时,返回true |
Class<?> | getDeclaringClass() | 返回与此枚举常量的枚举类型相对应的Class对象 |
String | name() | 返回此枚举常量的名称,在其枚举声明中对其进行声明 |
int | ordinal() | 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零) |
String | toString() | 返回枚举常量的名称,它包含在声明中 |
static<T extends Enum>T | static valueOf(ClassenumType,String name) | 返回带指定名称的指定枚举类型的枚举常量 |
上述的方法中仅有toString(),可以让我们重写。
上述方法使用示例:
// 枚举类Level
public enum Level{
LOW(10),MEDIUM(30),HIGH(60);
private int levelvalue;
private Level(int levelvalue){
this.levelvalue=levelvalue;
}
public int getLevelvalue(){
return levelvalue;
}
}
// 枚举类Level2
public enum Level2 {
LOW,MEDIUM,HIGH;
}
//各方法使用示例
public class Demo1 {
public static void main(String[] args) {
System.out.println("获取Level中LOW的数值:"+Level.LOW.getLevelvalue());
System.out.println("\nLOW与HIGH比较:"+Level2.LOW.compareTo(Level2.HIGH));
System.out.println("LOW与MEDIUM比较:"+Level2.LOW.compareTo(Level2.MEDIUM));
/**name()和String()区别
* name()方法是最终的,因此不能被覆盖
* toString()方法是可以被覆盖的,即重写
* 相同点:两者的返回值相同*/
System.out.println("\nname()方法:"+Level.LOW.name()); //打印常量的名称
System.out.println("toString()方法:"+Level.LOW.toString()); //打印常量的名称
System.out.println("\n枚举常量的序数:"+Level.LOW.ordinal());//初始常量为零
Level E = Enum.valueOf(Level.class,"HIGH");
System.out.println("\n返回带指定名称的指定枚举类型的枚举常量:"+E.name());
}
public static void test(Level level){
switch(level){
case LOW:break;
case HIGH:break;
}
}
}
运行结果:
实现接口的枚举类
所有的枚举都继承自java.lang.Enum类。Java不支持多继承,所以枚举对象不能再继承其他类。
每个枚举对象,都可以实现自己的抽象方法。
示例:
// 枚举类Level2
public enum Level2 implements LevelShow{
LOW{
@Override
public void show(){
System.out.println("低级别");
}
},MEDIUM {
@Override
public void show() {
System.out.println("中级别");
}
},HIGH{
@Override
public void show() {
System.out.println("高级别");
}
}
}
interface LevelShow{
void show();
}
// 实现接口的枚举类
public class Demo2 {
public static void main(String[] args) {
Level2.LOW.show();
Level2.HIGH.show();
}
public static void test(Level level){
switch(level){
case LOW:break;
case HIGH:break;
}
}
}
实现接口的枚举类,可以给它的每一个对象添加独特对于接口方法的实现。
运行结果:
注意事项
- 定义枚举后,最好不要修改里面的值,除非修改是必要的
- 枚举值默认继承的是java.lang.Enum类而不是Object类
- 枚举类不能有子类,因为其枚举类默认被final修饰
- 只能有private构造方法,不允许外部再去创造它
- switch中使用枚举时,直接使用常量名,不用携带类名
- 不能定义name属性,因为自带name属性
- 不要为枚举类中的属性提供set方法,不符合枚举最初设计初衷。
注解
Java注解(Annotation)又称为Java标注,是JDK5引入的一种注释机制。
Java语言中的类、方法、变量、参数和包等都可以被标注。
注解和注释不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。
JVM可以保留标注内容,在运行时可以获取到标注内容。
也支持自定义Java标注。
注解是可以运行到代码执行时的注释机制,也可简单理解为向JVM或人展示的一种注释。
一般常用的注释仅限于给人看,JVM是无法看到的。
主要用于:
- 编译格式检查
- 反射中解析
- 生成帮助文档
- 跟踪代码依赖
内置注解
- @Override : 重写 *
定义在java.lang.Override
public class Demo3 {
//重写
@Override
public String toString(){
return super.toString();
}
}
- @Deprecated:废弃 *
定义在java.lang.Deprecated
public class Demo3{
public static void main(String[] args) {
Person p = new Person();
/**
* p.setAge(18);
* 废弃注解不建议使用*/
p.setAge2(19);
}
static class Person {
private int age;
public int getAge() {
return age;
}
/*此方法已被废弃,可通过setAge2进行操作*/
@Deprecated
public void setAge(int age) {
this.age = age;
}
public void setAge2(int age){
if (age<0 || age>150){
throw new RuntimeException("age不合理")
}this.age=age;
}
}
}
废弃效果:
- @SafeVarargs
Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。 - @FunctionalInterface: 函数式接口 *
Java 8 开始支持,标识一个匿名函数或函数式接口。
- @Repeatable:
Java 8 开始支持,标识某注解可以在同一个声明上使用多次。 - SuppressWarnings:抑制编译时的警告信息。 *
定义在java.lang.SuppressWarnings
三种使用方式:
- @SuppressWarnings(“unchecked”) [^ 抑制单类型的警告]
- @SuppressWarnings(“unchecked”,“rawtypes”) [^ 抑制多类型的警告]
- @SuppressWarnings(“all”) [^ 抑制所有类型的警告]
参数列表:
关键字 | 用途 |
---|---|
all | 抑制所有警告 |
boxing | 抑制装箱、拆箱操作时候的警告 |
cast | 抑制映射相关的警告 |
dep-ann | 抑制启用注释的警告 |
deprecation | 抑制过期方法警告 |
fallthrough | 抑制确在switch中缺失breaks的警告 |
finally | 抑制finally模块没有返回的警告 |
hiding | 抑制相对于隐藏变量的局部变量的警告 |
incomplete-switch | 忽略没有完整的switch语句 |
nls | 忽略非nls格式的字符 |
null | 忽略对null的操作 |
rawtypes | 使用generics时忽略没有指定相应的类型 |
restriction | 抑制禁止使用劝阻或禁止引用的警告 |
serial | 忽略在serializable类中没有声明serialVersionUID变量 |
static-access | 抑制不正确的静态访问方式警告 |
synthetic-access | 抑制子类没有按最优方法访问内部类的警告 |
unchecked | 抑制没有进行类型检查操作的警告 |
unqualified-field-access | 抑制没有权限访问的域的警告 |
unused | 抑制没被使用过的代码的警告 |