java学习之枚举,注解和元注解

枚举

1.为什么要有枚举

  • 在我们使用一些类的时候,它的对象是固定的,不会有更多,例如,一个季节类,只有春天,夏天,秋天和冬天这四个对象,不能出现更多的对象,但是用类定义的话,我们就可以通过new很多的对象,比如白天,黑天等,但是放在现实中是不科学的m,其他的还有月份,季节等

  • 因此我们就有对它进行限制,所以产生了枚举类这个新功能. 所谓枚举(枚: 一个一个 举: 列举)就是一个个的列举出来,也就是把有限的对象列举出来,

  • 枚举(英文:enumeration)关键字为 enum;

2.自定义枚举

自定义枚举类要注意以下几点:

  • 构造器private修饰,(阻止使用者new 对象)
  • 去掉相关的Set方法,(不允许其修改属性)
  • 本类 里面创建固定的对象
  • 定义的对象用public static final 修饰,

自定义枚举类代码如下:

package hai.se.day16.dem01;

/**
 * @auther 海文宇
 * Date 2022/3/11 11:04
 * Description
 */
public class Test01 {
    public static void main(String[] args) {
        System.out.println(Season.AUTUMN);
        System.out.println(Season.SPRING);
        System.out.println(Season.WINTER);
        System.out.println(Season.SUMMER);
    }
}
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("冬天","寒冷");
    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 + '\'' +
                '}';
    }
}

3.enum关键字实现枚举

如果使用了枚举类的话,要注意以下几点:

  • class 关键字用enum代替
  • public static final Season SPRING=new Season(“春天”,“温暖”) 用SPRING(“春天”,“温暖”)替代;
  • 如果有多个常量(对象)使用 “,” (逗号)间隔即可,最后一个用 " ; "(分号)隔开.
  • 如果使用enum实现枚举,要求将定义常量对象写在最前面.

enum关键字实现枚举代码如下:

package hai.se.day16.dem01;

/**
 * @auther 海文宇
 * Date 2022/3/11 14:53
 * Description
 */
public class Enumeration {
    public static void main(String[] args) {
        System.out.println(Season1.AUTUMN);
        System.out.println(Season1.SPRING);
        System.out.println(Season1.SUMMER);
        System.out.println(Season1.WINTER);
    }
}

enum Season1{
    //创建其四个对象,固定
    SPRING("春天","温暖"),
    SUMMER("夏天","炎日"),
    AUTUMN("秋天","凉爽"),
    WINTER("冬天","寒冷");
    private  String name;//季节名称
    private  String desc;//季节描述
    private Season1(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 + '\'' +
                '}';
    }
}

4.enum关键字实现枚举的注意事项

  • 使用enum关键字开发一个枚举时,会默认的继承Enum类,
  • 使用传统的 public static final Season SPRING=new Season(“春天”,“温暖”); 简化成 SPRING(“春天”,“温暖”),
  • 我们必须知道它调用的是那个构造器
  • 如果是无参构造创建枚举对象,则实参列表和小括号都可以省略
  • 当创建多个枚举对象的时候,使用 逗号 间隔,最后一个用分号结尾.
  • 枚举对象必须放在枚举类的首行

知识拓展:
enum 会继承Enum类,我们可以使用javap来对枚举类的 .class文件进行反编译,我们可以看到一些enum类中没有定义的方法,这些方法就是Enum 类的方法.,如下图.

在这里插入图片描述

5.enum关键字的常用方法

在这里插入图片描述

方法的使用代码如下:

package hai.se.day16.dem01;

/**
 * @auther 海文宇
 * Date 2022/3/11 14:53
 * Description
 */
public class Enumeration {
    public static void main(String[] args) {
        //枚举类各种方法的使用演示:
        Season1 autumn = Season1.AUTUMN;
        //1.输出枚举对象的名称
        System.out.println(autumn.name());
        //2.ordinal(),输出该枚举对象的次序编号,从0开始编号
        System.out.println(autumn.ordinal());
        //3.values()方法,返回的是Season1[]数组;
        for (Season1 value : Season1.values()) {
            System.out.println(value);
        }
        //4.valueOf()将字符串转成枚举对象,要求字符串必须为已有的常量名,否则报错.
        Season1 autumn1 = Season1.valueOf("AUTUMN");
        System.out.println("autumn1"+autumn1);
        //5.compareTo(),比较两个枚举常量,比较的是编号.
        //Season1.AUTUMN编号  -  Season1.SUMMER的编号
        System.out.println(Season1.AUTUMN.compareTo(Season1.SUMMER));
    }
}

enum Season1{
    //创建其四个对象,固定
    SPRING("春天","温暖"),
    SUMMER("夏天","炎日"),
    AUTUMN("秋天","凉爽"),
    WINTER("冬天","寒冷");
    private  String name;//季节名称
    private  String desc;//季节描述
    private Season1(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 + '\'' +
                '}';
    }
}


注解

  • 注解(Annotation)也成为称为元数据(Metadata),用于修饰解释,包,类,方法,构造器,局部变量等信息.
  • 和注释一样,注解不影响程序逻辑,单注解可以被编译或运行,相当于嵌入在代码中的补充信息.
  • 在javaSE中,注解的使用目的比较简单,例如标记过时功能,忽略警告等.在javaEE中注解占据了重要的角色,例如用来配置应用程序的任何切面,代替 java EE 旧版汇中所遗留的代码冗余和XML配置等.

1.@oberride注解

限定某个方法,是重写父类方法,该注解只能用于方法.

  • 对于@override注解,写了还是没写,都表示重写父类的方法,但是写了,编译器就会检查该方法是否是重写父类的方法,如果确实重写了,则编译通过,否则不通过.
  • 如果发现 @Interface 表示一个注解类
  • @Target 是修饰注解的注解,也称为元注解

2.@deprecated注解

用于表示某个程序元素(类和方法)已过时,

  • 表示过时的,不推荐使用,但是还是可以使用
  • 可以修饰类,方法,字段,包,参数,等等
  • 可以用于版本的升级过度.

3.@supresswarnings

抑制编译器警告.

  • 当我们不希望看到警告的时候,可以使用supresswarnings来抑制警告.
  •   	 格式:@supresswarnings({" "})  可以填了入 all 参数取消所有的警告.,参数有很多.
    
  • 可以标注在类、字段、方法、参数、构造方法,以及局部变量上。
  • 关于它的参数可以传一个数组.

元注解

所谓元注解就是对注解进行注解

1.元注解的种类(使用不多,了解)

  • Retention //指定注解的作用范围,三种,SOURCE,CLASS,RUNTIME.
  • Target //指定注解可以在那些地方使用
  • Documented //指定该注解是否会在javadoc中体现.
  • Inherited //子类会继承父类的注解

2.@Retention注解

只能用于修饰一个Annotation定义,用于指定该Annotation可以保留多长时间,@Retention包含一个RetentionPolicy类型的成员变量,使用Retention时必须为该value成员变量指定值.

Retention的三种值:

  1. RetentionPolicy.SOURCE编译使用后,直接丢弃 这种策略的注释
  2. RetentionPolicy.CLASS编译器将把注释记录在Class文件中 ,当运行java程序时,JVM不会保留注解, 这是默认值
    3)RetentionPolicy.RUNTIME编译器将把注解记录在Class文件中 ,当运行java程序时,JVM会保留注解

2 @Target

指定注解可以在那些地方使用

3.@Documented

指定该注解是否会在javadoc中体现,会被Annotation类将被javadoc工具提取成文档,即在生成该文档时,可以看到该注解.

4.@Inherited

被他修饰的Annotation将具有继承性,如果某个类被@Inherited修饰,其子类将自动具有该注解.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值