Java笔记(20)-枚举类和注解,了解一下

1.枚举类的介绍和基础使用

  1. 什么条件下可以使用枚举类?
    (1)类的对象是有限个且均为确定的;
    (2)当需要定义一组常量时,可以考虑枚举类;
  2. 自定义枚举类(通过enum,附简单使用)
public class EnumTest {

    public static void main(String[] args) {
        System.out.println(Season.SPRING);
    }

}


/*通过enum定义一个简单的枚举类*/
enum Season {
    //定义对象属性;
    // 定义需要的常量数据,以及它的名字,由于本来就属于是一种不可变的常量,这是默认的定义方法;
    SPRING("春天"),//这种就类似于 public final Season SPRING = new Season("春天");
    SUMMER("夏天"),
    AUTUMN("秋天"),
    WINTER("冬天");

//定义一个常量
    private final String season;

         //    定义一个私有构造器,这样的话就不能够自己创建新的对象,否则就不是什么确定的对象和常量了;
    private Season(String season) {
        this.season = season;
    }

    //写一个toString方法;
    @Override
    public String toString() {
        return "Season{" +
                "season='" + season + '\'' +
                '}';
    }
}

在上述代码的enum类中,首先要确定的就是它的对象常量和属性(就像是那个Thread.State枚举类中所定义的几种类型的常量对象一样),所有定义的属性必须要放在最前面,否则就会报错;其次就是toString方法,如果不写,就只能输出对象名,由于继承的是Enum类,而不是Object类,所以不会输出地址;

如上图,这是Object类里面的toString,只有继承了Object才会在没有自定义toString的时候输出地址;

  1. 枚举类中最常用的几个方法
    方法名 方法作用
    toString() 可以通过重写,将对象中的属性进行输出,如果不重写,默认使用的是Enum类中的toString()方法
    values() 该方法主要是返回一个数组,将枚举类中所定义的所有对象全部输出
    valueof(String name) 该方法是通过字符串,在当前枚举类的对象中进行查找,查找到之后就返回与name同名的对象
    以下给一个valueof()方法的示例:
   /*按照上面的程序所给,这里如果通过下面同名字符串
   *进行查找,就会报异常,因为在Season中没有定义这个对象
   *报出的异常是java.lang.IllegalArgumentException;
   *因此使用这个方法时,中间的字符串,必须和对象名一模一样
    */
        //Season s = Season.valueOf("spring");
        Season s = Season.valueOf("SPRING");//这才是正确的,不会报异常;
        System.out.println(s);

2. 在枚举类中怎么实现接口

首先目前最为基础的两种方法,我简单的进行记录,省的以后自己不懂了,麻烦;
如下简单的实现代码;

interface info {
    void show();
}

/*通过enum定义一个简单的枚举类*/
enum Season 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 season;

    //    定义一个私有构造器,
    private Season(String season) {
        this.season = season;
    }

    //写一个toString方法;
    @Override
    public String toString() {
        return season;
    }

    //第二种写法,前提是不写在对象里面,如果每个Season对象都单独写了一份,那就可以不需要写了;
    @Override
    public void show() {
        System.out.println("这是季节");
    }
}

由于在前面提到过,在enum枚举类中每一个定义的所谓的属性,其实都是对象,那么在创建对象时,是可以实现接口中的方法的;这可能也是枚举类的一个优点,每个对象都可以是有自己独特的实现方法;

注意:如果在对象里面添加了属性,那是必须要设置构造方法的,否则如果不需要在对象中添加属性,如下图程序也是可以的;(可以用来和上面的程序进行对比,就知道这句话是什么意思了。)

enum Season implements info {

    // 定义需要的常量数据,以及它的名字,由于本来就属于是一种不可变的常量,这是默认的;
    //第一种实现接口中方法的写法,每一个对象都单独进行重写;
    SPRING {
        @Override
        public void show() {
            System.out.println("这是在春天");
        }
    },
    //仔细看就会发现这个对象不是SUMMER(String),就证明这个对象没有设置单独的属性;
    SUMMER{
        @Override
        public void show() {
            System.out.println("这是在夏天");
        }
    },
    AUTUMN {
        @Override
        public void show() {
            System.out.println("这是在秋天");
        }
    },
    WINTER {
        @Override
        public void show() {
            System.out.println("这是在冬天");
        }
    };

    //第二种写法,前提时不写在对象里面,如果每个Season对象都单独写了一份,那就可以不需要写了;
    @Override
    public void show() {
        System.out.println("这是季节");
    }
}

3.注解的介绍(Annotation)

  1. 其实总的来说,注解的作用就是为了编码的便利;就比如编写servlet的时候,需要进行必要的XML配置,像是servlet-name,url-pattern等,比较麻烦,但是使用注解往往就是在servlet类名前使用注解@WebServlet()括号中间填写参数就是servlet的名字,效果就像是完成了XML的基本配置;

常用的几个注解有:

注解名 注解介绍
@Override 这个注解一般是使用在重写的方法前面
@SuppressWarnings(String value[ ]) 这个注解主要是用于去除一些警告,比如你某些变量可能没有用到,或者是你的某些容器没有添加泛型,编译器一般都会警告,用这个就可以消除;
@param 用来表明当前方法的参数
@Deprecated 用来说明该方法已经不推荐使用(详细可以观看Date类源码,几乎全部被注解,除此之外这个注解也可以在javadoc文档中显示,可以观看API文档;)
@deprecated 该注解用来对方法进行介绍
@WebServlet(name=“”) 其中的参数是String

大部分注解只需要了解;

  1. 自定义注解

在官方的注解中,注解是这样定义的:
在这里插入图片描述
通过@interface,但是这不是接口;

public @interface myannotation {
    int value();
}

这就相当于一种简单的自定义注解了;至于想用在哪里,目前也就了解一下,基本上在我看来,只要能够使用官方自带的注解就差不多了,这种自定义注解了解一下完全就OK;
在这里插入图片描述

4. 元注解

  1. 在Java的JDK1.5中提供了四个标准的元注解:
元注解名 介绍
@Retention 用于指定所修饰的Annotation的生命周期,生命周期总共有三种:SOURCE,CLASS(默认状态),RUNTIME(可被放射获取);
@Target 表明所修饰的Annotation可以修饰哪些元素;这个注解中的属性位于 ElementType这个枚举类中,大致就是有类,构造器等,简单来说就是决定你的注解能放在用来放在哪里;
@Documented 在javadoc中默认是不包含注解的,如果想要在文档中包含注解,就需要在注解的前面,使用这个元注解修饰;
@Inherited 这个注解是要是注解具有继承性,简单举个例子,A是这个元注解,它修饰了B,那么B如果修饰了类c,而类a又继承了类c,那么类a也会包含这个注解;

元注解主要是用来修饰其他的Annotation;

5. JDK 8 中的注解特性

  1. 可重复注解:@Repeatable属于JDK8中才出现的;
    在这里插入图片描述
    首先要在需要重复定义的注解中使用注解@Repeatable修饰,而且其中要有参数;
    在这里插入图片描述
    这里就是要定义一个以需要重复注解的注解数组;方便上面的@Repeatable调用;
    在这里插入图片描述
    需要注意的点是: myannotation注解生命周期(@Retention要相同),以及他们的使用的修饰类型要相同(即@Target要相同),最后它们的继承性也要相同(即@Inherited要相同);
    在这里插入图片描述

  2. 类型注解:就是指,可以直接使用注解,在各种类型前面;详情不做过多赘述,了解即可;
    比如:

猜你喜欢

转载自blog.csdn.net/dxsdcyy/article/details/106320258
今日推荐