09枚举类、注解
目录
枚举类和注解
枚举类
枚举类介绍:
1.枚举对应英文(enumeration,简写enum)
2.枚举是一组常量的集合
3.可以理解为:枚举属于一种特殊的类,里面只包含一组有限的特定的对象
自定义类实现枚举
创建Season对象有如下特点:
1季节的值是有限的几个值(spring,summer,autumn,winter)
2只读,不需要修改
1.构造器私有化
2.本类内部创建一组对象[]
3.对外暴露对象(通过为对象添加public final static修饰符)
4.可以提供get方法,但是不要提供set
enum关键字实现枚举注意事项:
1.当我们使用enum关键字开发一个枚举类时,默认会继承Enum类,而且是一个final类

2.传统的public static final Season2 SPRING = new Season2("春天","温暖")简化成 SPRING("春天","温暖"),这里必须知道,它调用的是哪个构造器
3.如果使用无参构造器 创建 枚举对象,则实参列表和小括号都可以省略
4.当有多个枚举对象时,使用,间隔,最后一个;结尾
5.枚举对象必须放在枚举类的行首
enum常用方法说明:
使用关键字enum时,会隐式继承Enum类,这样我们就可以使用Enum相关的方法。
举例说明enum常用的方法的使用

1.toString:Enum类已经重写过了,返回的是当前对象名,子类可以重写该方法,用于返回对象的属性信息
2.name:返回当前对象名(常量名),子类中不能重写
3.ordinal:返回当前枚举类中索引的常量
4.values:返回当前枚举类中索引常量
5.valueOf:将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常
6.compareTo:比较两个枚举常量,比较的就是位置号

enum实现接口
1使用enum关键字后,就不能再继承其它类了,因为enum会隐式继承Enum,而Java是单继承
2枚举类和普通类一样,可以实现接口。如:enum 类名 implements 接口1,接口2
练习:
1下面代码是否正确:
enum Gender{
BOY,GIRL;
}
(1)正确 (2)枚举类Gender没有熟悉 (3)有两个枚举对象,使用的无参构造
2下面输出什么:
enum Gender{
BOY,GIRL;
}
Gender boy = Gender.BOY;
Gender boy2 = Gender.BOY;
System.out.println(boy);
//BOY,本质就是调用Gender的父类Enum的toString方法
System.out.println(boy2 == boy)//true
3完成下面要求:
1声明Week枚举类,其中包含星期一至星期日的定义;
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
2使用values返回索引的枚举数组,并遍历,
注解
注解的理解:
1.注解(Annotation)也被称为元数据(Metadata),用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息。
2.和注释一样,注释不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。
3.在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告灯。在JavaEE中注解占据了更重要的角色,例如用来配置应用城区的任何切面,代替javaEE旧版中遗留的繁冗
基本的Annotation介绍
使用Annotation时要在其前面增加@符号,并把该Annotation当成一个修饰符使用。用于修饰它支持的程序元素。
三个基本的Annotation:
1.@Override:限定某个方法,是重写父类方法,该注解只能用于方法
2.@Deprecated:用于表示某个程序元素(类,方法等)已过时
3.@SuppressWarnings:抑制编译器警告
@Override注解的案例:
@Override:限定某个方法,是重写父类方法,该注解只能用于方法
class Father{
public void fly(){
System.out.println("fly()");
}
}
class Son extends Father{
@Override//说明
public void fly(){
System.out.println("fly()...");
}
}
补充说明:@interface的说明
@interface 不是interface,是注解类 是jdk1.5之后加入的
Override 使用说明:
1.@Override 表示指定重写父类的方法(从编译层面验证),如果父类没有fly方法,则会报错
2.如果不写@Override 注解,而父类仍有 public void fly(){},仍然构成重写
3.@Override只能修饰方法,不能修饰其他类,包,属性等
4.查看@Override注解源码为 @Target(ElementType.METHOD),说明只能修饰方法
5.@Target 是修饰注解的注解,称为元注解
@Deprecated注解的案例:
@Deprecated
class Father{
@Deprecated
public String name;
public void fly(){
System.out.println("fly()");
}
//@Deprecated的说明 几点。
@Deprecated
public void sing(){
System.out.println("sing()");
}}
class Son extends Father{
//@Override 使用说明
@Override
public void fly(){
System.out.println("fly()...");
}
}
@Deprecated使用说明:
1.用于表示某个程序元素(类,方法等)已过时
2.可以修饰方法,类,字段,包,参数 等待
3.@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
4.@Deprecated 的作用可以做到新旧版本的兼容和过度
@SuppressWarnings注解的案例:
public class AnnotationDemo01{
public static void main(String[] args){
List list = new ArrayList();
list.add("");
list.add("");
list.add("");
int i;
System.out.println("list.get(1)");
}
}
@SuppressWarnings说明
1.unchecked是忽略没有检查的警告
2.rawtypes 是忽略没有指定泛型的警告(传参时没有指定泛型的警告错误)
3.unused 是忽略没有使用某个变量的警告错误
4.@SuppressWarnings 可以修饰的程序元素为,查看@Target
5.生成@SuppressWarnings时,不用背,直接点击左侧的黄色提示,就可以选择,(注意可以指定生成的位置)
@Retention 说明
只能用于修饰一个 Annotation 定义,用于指定该 Annotation 可以保留多长时间,@Retention包含一个 RetentionPolicy 类型的成员变量,使用 @Retention 时 必须为该value成员变量指定值:
@Retention的三种值:
1.RetentionPolicy.SOURCE:编译器使用后,直接丢弃这种策略的注释
2.RetentionPolicy.CLASS:编译器讲吧注解记录在class文件中。当运行java程序时,JVM不会保留注解。这是默认值
3.RetentionPolicy.RUNTIME:编译器将把注解记录在 class 文件中。当运行java程序时,JVM会保留注释。程序可以通过反射获取该注释
@Retention案例:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)//这个就是@retention的取值
public @interface Override {}
小结:Override 的作用域在 SOURCE,当编译器编译时生效,不会写入到.class文件,也不会在runtime(运行时)生效
@Target 说明:
用于修饰 Annotation 定义,用于指定被修饰的 Annotation 能用于修饰哪些程序元素。@Target 也包含一个名为 value 的成员变量。
@Inherited 说明:
被它修饰的 Annotation 将具有继承性。如果某个类使用了被@Inherited 修饰的 Annotation,则其子类将自动具有该注解
作业:
1编程题(枚举类):
1.创建一个Color枚举类
2.有RED,BLUE,BLACK,YELLOW,GREEN这五个枚举值/对象
3.Color有三个属性redValue,greenValue,blueValue
4.创建构造方法,参数包括这三个属性
5.每个枚举值都要给三个属性赋值,三个属性对应的值分别是
6.red:255,0,0 blue:0,0,255 black:0,0,0 yelow:255,255,0 green:0,255,0
7.定义接口,里面有方法show,要求Color实现该接口
8.show方法中显示三属性的值
9.将枚举对象在switch语句中匹配使用
点击查看代码
public class homework01 {
public static void main(String[] args) {
Color red = Color.RED;
loop(red);
red.show();
Color blue = Color.BLUE;
loop(blue);
blue.show();
}
public static void loop(Color color){
switch (color){
case RED:
System.out.print("匹配到红色");
break;
case BLUE:
System.out.print("匹配到蓝色");
break;
case BLACK:
System.out.print("匹配到黑色");
break;
case YELLOW:
System.out.print("匹配到黄色");
break;
case GREEN:
System.out.print("匹配到绿色");
break;
}
}
}
/*
1.创建一个Color枚举类
2.有RED,BLUE,BLACK,YELLOW,GREEN这五个枚举值/对象
3.Color有三个属性redValue,greenValue,blueValue
4.创建构造方法,参数包括这三个属性
5.每个枚举值都要给三个属性赋值,三个属性对应的值分别是
6.red:255,0,0 blue:0,0,255 black:0,0,0 yelow:255,255,0 green:0,255,0
7.定义接口,里面有方法show,要求Color实现该接口
8.show方法中显示三属性的值
9.将枚举对象在switch语句中匹配使用
*/
enum Color implements IMyInterface{
RED(255,0,0),BLUE(0,0,255),BLACK(0,0,0),YELLOW(255,255,0),GREEN(0,255,0);
private int redValue;//红值
private int greenValue;//绿值
private int blueValue;//蓝值
Color(int redValue, int greenValue, int blueValue) {
this.redValue = redValue;
this.greenValue = greenValue;
this.blueValue = blueValue;
}
@Override
public void show() {
System.out.println("\t值为:"+redValue+","+greenValue+","+blueValue);
}
}
interface IMyInterface{
public void show();
}

浙公网安备 33010602011771号