Java - 枚举类和注解
一、枚举类介绍
二、自定义实现枚举类
- 不需要提供set方法,因为枚举对象值通常为只读。
- 对枚举对象/属性使用 final + static 共同修饰,实现底层优化。
- 枚举对象名通常使用全部大写,常量的命名规范。
- 枚举对象根据需要,也可以有多个属性
示例:
package Enum_;
public class Enum02 {
public static void main(String[] args) {
System.out.println(Season.AUTUMN);
}
}
//演示自定义枚举类实现
class Season {
private String name;
private String desc;//描述
//定义四个对象
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("冬天","寒冷");
//1.将构造器私有化,目的防止 直接new
//2.去掉set方法,防止属性被修改
//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 + '\'' +
'}';
}
}
小结:
- 构造器私有化
- 本类内部创建一组对象。
- 对外暴露对象(通常为对象添加 public final static 修饰符)。
- 可以提供 get 方法,但是不用提供 set 方法。
三、enum关键字实现枚举类
示例:
package Enum_;
public class Enum03 {
public static void main(String[] args) {
System.out.println(Season2.SPRING);
}
}
enum Season2 {
//如果使用 enum 来实现枚举类
//1. 使用关键字 enum 替换 class
//2. public static final Season SPRING = new Season("春天","温暖");直接使用
// SPRING("春天","温暖");
//3. 如果有多个常量(对象),使用 逗号间隔即可。
//4. 如果使用 enum 来实现枚举类,要求将定义的常量对象写在最前面。
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类,而且是一个 final 类。
下面我们来证明下:使用反编译指令javap
2. 传统的 public static final Season2 SPRING = new Season2("春天","温暖");简化成 SPRING("春天","温暖"),调用的是有两个字符串的构造器。
2. 如果使用无参构造器 创建 枚举对象,则实参列表和小括号都可以省略。
2. 当有多个枚举对象时,使用逗号间隔,最后一个分号结尾。
2. 枚举对象必须放在枚举类的行首。
2. 构造器要私有化。
> **细节:** > 1. **使用 enum 关键字后,就不能再继承其他类了,因为 enum 会隐式继承Enum,而Java是单继承机制。** > 1. **枚举类和普通类一样,可以实现接口,如下形式:
**`**enum 类名 implements 接口1,接口2{}**`
四、JDK内置的基本注解类型
1. 注解的理解
- 注解(Annotation)也称为元数据(Metadata),用于修饰解释包、类、方法、属性、构造器、局部变量等数据信息。
- 和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。
2. 基本的 Annotation 介绍
使用 Annotation 时要在其前面增加 @ 符号,并把该 Annotation 当成一个修饰符使用,用于修饰它支持的程序元素。
三个基本的 Annotation:
- @Override:限定某个方法,是重写父类方法,该注解只能用于方法。
示例:
package annotation;
public class Override {
}
class Father {
public void fly() {
System.out.println("father 正在飞");
}
}
class Son extends Father {
//1. @Override 注解放在 fly 方法上,表示子类 fly 方法重写了父类的 fly
//2. 这里如果没有写 @Override 还是重写了父类fly
//3. 如果写了@Override注解,编译器就会去检查该方法是否真的重写了父类的方法,
// 如果的确重写了,则编译通过,如果没有构成重写,则编译错误。
//4. 看看@Override的定义
// 解读:如果发现 @interface ,则表示一个 注解类
/*
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
*/
@java.lang.Override
public void fly() {
System.out.println("son 正在飞");
}
}
Override 使用说明:
- @Deprecated:用于表示某个程序元素(类、方法等)已过时。
示例:
package annotation;
public class Deprecated {
public static void main(String[] args) {
A a = new A();
System.out.println(a.n1);
a.hi();
}
}
//1. @Deprecated 修饰某个元素,表示该元素已经过时了
//2. 即不再推荐使用,但是仍然可以使用
//3. 查看 @Deprecated 注解类的源码
//4. 可以修饰方法,类、字段、包、参数等
//5. @Deprecated 可以做版本升级过渡使用
/*
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
*/
@java.lang.Deprecated
class A {
public int n1 = 10;
public void hi(){
}
}
- @SuppressWarnings:一直编译器警告。
示例:
package annotation;
import java.util.ArrayList;
import java.util.List;
public class SuppressWarnings_ {
@SuppressWarnings({"all"})
public static void main(String[] args) {
//1. 当我们不希望看到这些经过的时候,可以使用 SuppressWarnings 注解来抑制经过信息
//2. 在 {""} 中,可以写入你希望抑制(不显示)的警告信息。
//3. 关于 SuppressWarnings 作用范围是和你放置的位置相关
// 比如 @SuppressWarnings 放置在 main 方法,那么抑制警告的范围就是 main
// 通常我们可以放置具体的语句、方法、类。
//4. 看看 @SuppressWarnings 的源码
// (1)放置的位置就是 TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE
// (2)该注解类有数组:String[] value() 设置一个数组比如 {"rawtypes","unchecked"}
/*
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
*/
List list = new ArrayList();
list.add("jack");
list.add("tom");
list.add("mary");
int i;
System.out.println(list.get(1));
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通