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();
}
posted @ 2022-03-09 21:45  栗子一块两块  阅读(28)  评论(0)    收藏  举报