Java的枚举,注解和反射(一)

 更新时间:2021年07月05日 09:06:00   作者:保护眼睛  
今天小编就为大家分享一篇关于Java枚举,注解与反射原理说明,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

枚举

什么是枚举?

枚举的字面意思就是 一一列举出来

在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。再比如线程的状态:创建、运行、阻塞、等待、消亡,这也是一个枚举。

在java中的枚举也是类似的:

枚举是在JDK1.5以后引入的。主要用途是:将一组常量组织起来。

当需要定义一组常量的时候就可以使用枚举。枚举的对象是有限的、确定的。

枚举本身就是一个类,其构造方法默认为私有的。

如果枚举类的对象只有一个,则可以作为单例模式的一种实现方式。

枚举类的实现

自定义实现枚举类

jdk1.5之前使用自定义的方式实现枚举类的定义

package enumDemo;
/**
 * user:ypc;
 * date:2021-06-22;
 * time: 18:21;
 * 自定义实现枚举类
 */
public class EnumDemo1 {
    public static void main(String[] args) {
        Season spring = Season.SPRING;
        System.out.println(spring);
    }
}
//自定义实现季节的枚举类
class Season {
    //1.首先要求枚举类是常量,就可以使用 private final 来修饰
    private final String seasonName;
    private final String seasonDesc;
    //2.常量肯定要赋值,提供私有的构造方法来初始化常量
    private Season(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
    //3.枚举的对象是有限个的,确定的。所以要提供对应的枚举对象
    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("冬天", "冰天雪地");
    //提供获取枚举的属性的方法
    public String getSeasonName() {
        return seasonName;
    }
    public String getSeasonDesc() {
        return seasonDesc;
    }
    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
}

在这里插入图片描述

使用关键字enum定义枚举类

jdk1.5引入enum关键字

package enumDemo;
import org.junit.Test;
/**
 * user:ypc;
 * date:2021-06-22;
 * time: 18:40;
 * 使用enum关键字来定义枚举类
 */
public class EnumDemo2 {
    @Test
    public void test(){
        SeasonEnum spring = SeasonEnum.SPRING;
        System.out.println(spring);
        //枚举类的父类是
        System.out.println("枚举类的父类是:"+SeasonEnum.class.getSuperclass().getName());
    }
}
enum SeasonEnum{
    //提供当前枚举类的对象,之间使用","隔开,最后一个对象使用";"隔开
    SPRING("春天","春暖花开"),
    SUMMER("夏天","夏日炎炎"),
    AUTUMN("秋天","秋高气爽"),
    WINTER("冬天","冰天雪地");

    private final String seasonName;
    private final String seasonDesc;
    private SeasonEnum(String seasonName,String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
}

在这里插入图片描述

Enum的常用方法

package enumDemo;
import org.junit.Test;
/**
 * @author ypc
 * @create 2021-06-22;
 * 枚举类常用的方法
 */
public class EnumDemo3 {
    @Test
    public void test() {
        //toString方法
        System.out.println(SeasonEnum.SPRING.toString());
        System.out.println("****************************");
        //values方法.
        SeasonEnum[] seasonEnums = SeasonEnum.values();
        System.out.println("季节枚举类中的对象:");
        for (SeasonEnum seasonenum : seasonEnums) {
            System.out.println(seasonenum);
        }
        System.out.println("****************************");
        //线程状态中的所有的枚举的对象
        Thread.State[] states = Thread.State.values();
        System.out.println("线程状态枚举类中的对象:");
        for (int i = 0; i < states.length; i++) {
            System.out.println(states[i]);
        }
        System.out.println("****************************");
        //valueOf方法
        SeasonEnum winter = SeasonEnum.valueOf("WINTER");
        System.out.println(winter);
    }
}

在这里插入图片描述

实现接口的枚举类

实现接口,在枚举类中实现抽象方法

interface info {
    void show();
}
enum SeasonEnumImplementsInterface1 implements info {
    //提供当前枚举类的对象,之间使用","隔开,最后一个对象使用";"隔开
    SPRING("春天", "春暖花开"),
    SUMMER("夏天", "夏日炎炎"),
    AUTUMN("秋天", "秋高气爽"),
    WINTER("冬天", "冰天雪地");

    private final String seasonName;
    private final String seasonDesc;
    private SeasonEnumImplementsInterface1(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
    @Override
    public void show() {
        System.out.println("枚举类实现了接口的抽象方法");
    }
}

在这里插入图片描述

让接口的每个枚举对象都实现各自的方法

//枚举的各个对象实现了接口的抽象方法
enum SeasonEnumImplementsInterface2 implements info {
    //提供当前枚举类的对象,之间使用","隔开,最后一个对象使用";"隔开
    SPRING("春天", "春暖花开") {
        @Override
        public void show() {
            System.out.println("春天来了");
        }
    },
    SUMMER("夏天", "夏日炎炎") {
        @Override
        public void show() {
            System.out.println("夏天到了");
        }
    },
    AUTUMN("秋天", "秋高气爽") {
        @Override
        public void show() {
            System.out.println("秋天来了");
        }
    },
    WINTER("冬天", "冰天雪地") {
        @Override
        public void show() {
            System.out.println("冬天来了");
        }
    };

    private final String seasonName;
    private final String seasonDesc;
    private SeasonEnumImplementsInterface2(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
}

在这里插入图片描述

public class EnumDemo4 {
    @Test
    public void test1(){
        SeasonEnumImplementsInterface1[] SeasonEnumImplementsInterface1s = SeasonEnumImplementsInterface1.values();
        System.out.println("季节枚举类中的对象:");
        for (SeasonEnumImplementsInterface1 seasonEnumImplementsInterface1:SeasonEnumImplementsInterface1s) {
            System.out.println(seasonEnumImplementsInterface1);
            seasonEnumImplementsInterface1.show();
        }
    }
    @Test
    public void test2(){
        SeasonEnumImplementsInterface2[] SeasonEnumImplementsInterface2s = SeasonEnumImplementsInterface2.values();
        System.out.println("季节枚举类中的对象:");
        for (SeasonEnumImplementsInterface2 seasonEnumImplementsInterface2:SeasonEnumImplementsInterface2s) {
            System.out.println(seasonEnumImplementsInterface2);
            seasonEnumImplementsInterface2.show();
        }
    }
}

注解

注解概述

在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行。
A

nnotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理。通过使用 Annotation,程序员可以在不改变原逻辑的情况下, 在源文件中嵌入一些补充信息。

Annotation可以像修饰符一样使用,可以用来修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被保存在Annotation的“name = value”对中。

在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。
一定的程度上可以说框架 = 注解 + 反射机制 + 设计模式

常见的注解

1.生成文档相关的注解

2.在编译的时候进行格式的检查

3.跟踪代码的依赖性,实现代替配置文件的功能

package AnnotationDemo;
/**
 * 1.生成文档相关的注解
 * @author ypc
 * @create 2021-06-22;
 */
public class AnnotationDemo1 {
}
class B implements A{
    //2.在编译的时候进行格式的检查
    @Override
    public void test() {
    }
}
interface A{
    void test();
}
/**
 * 3.跟踪代码的依赖性,实现代替配置文件的功能
 * 未使用注解的时候
  <servlet>
    <servlet-name>reg</servlet-name>
    <servlet-class>service.RegServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>reg</servlet-name>
    <url-pattern>/reg</url-pattern>
  </servlet-mapping>
 使用注解之后:
 @WebServlet("/reg")
 */

总结

本篇文章的上半部分就到这里了,希望对你有所帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • SpringBoot如何通过自定义注解实现权限检查详解

    SpringBoot如何通过自定义注解实现权限检查详解

    这篇文章主要给大家介绍了关于SpringBoot如何通过自定义注解实现权限检查的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Javaweb开发中通过Servlet生成验证码图片

    Javaweb开发中通过Servlet生成验证码图片

    这篇文章主要为大家详细介绍了Javaweb开发中通过Servlet生成验证码图片的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Java线程安全与非线程安全解析

    Java线程安全与非线程安全解析

    这篇文章主要介绍了Java线程安全与非线程安全解析,涉及非线程安全现象模拟以及线程安全的实现等相关内容,需要的朋友可以参考,一起交流学习。
    2017-10-10
  • Java中PageHelper分页后对list操作导致分页无效

    Java中PageHelper分页后对list操作导致分页无效

    在项目中使用分页插件的时候发现PageHelper插件失效了,本文就来介绍一下Java中PageHelper分页后对list操作导致分页无效的解决方法,感兴趣的可以了解一下
    2021-05-05
  • Java集合之HashMap用法详解

    Java集合之HashMap用法详解

    这篇文章主要介绍了Java集合之HashMap用法,结合实例形式分析了java map集合中HashMap定义、遍历等相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • Java interrupt()方法使用实例介绍

    Java interrupt()方法使用实例介绍

    一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果比如会带着自己所持有的锁而永远的休眠,迟迟不归还锁等。 所以你看到Thread.suspend, Thread.stop等方法都被Deprecated了
    2023-02-02
  • AbstractQueuedSynchronizer(AQS)锁状态同步和排队管理

    AbstractQueuedSynchronizer(AQS)锁状态同步和排队管理

    这篇文章主要介绍了为大家AbstractQueuedSynchronizer(AQS)锁状态同步和排队管理源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • java.lang.NoClassDefFoundError错误的原因及解决方法

    java.lang.NoClassDefFoundError错误的原因及解决方法

    这篇文章主要给大家介绍了关于java.lang.NoClassDefFoundError错误的原因及解决的相关资料,java.lang.NoClassDefFoundError是Java虚拟机在运行时无法找到特定类的错误,需要的朋友可以参考下
    2023-10-10
  • 关于JAVA11中图片与BASE64相互转换的实现

    关于JAVA11中图片与BASE64相互转换的实现

    这篇文章主要介绍了关于JAVA11中图片与BASE64相互转换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Java无界阻塞队列DelayQueue详细解析

    Java无界阻塞队列DelayQueue详细解析

    这篇文章主要介绍了Java无界阻塞队列DelayQueue详细解析,DelayQueue是一个支持时延获取元素的无界阻塞队列,队列使用PriorityQueue来实现,队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素,需要的朋友可以参考下
    2023-12-12

最新评论