1.枚举类的介绍和基础使用
- 什么条件下可以使用枚举类?
(1)类的对象是有限个且均为确定的;
(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的时候输出地址;
- 枚举类中最常用的几个方法
方法名 方法作用 toString() 可以通过重写,将对象中的属性进行输出,如果不重写,默认使用的是Enum类中的toString()方法 values() 该方法主要是返回一个数组,将枚举类中所定义的所有对象全部输出 valueof(String name) 该方法是通过字符串,在当前枚举类的对象中进行查找,查找到之后就返回与name同名的对象
/*按照上面的程序所给,这里如果通过下面同名字符串
*进行查找,就会报异常,因为在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)
其实总的来说,注解的作用就是为了编码的便利;就比如编写servlet的时候,需要进行必要的XML配置,像是servlet-name,url-pattern等,比较麻烦,但是使用注解往往就是在servlet类名前使用注解@WebServlet()括号中间填写参数就是servlet的名字,效果就像是完成了XML的基本配置;
常用的几个注解有:
注解名 | 注解介绍 |
---|---|
@Override | 这个注解一般是使用在重写的方法前面 |
@SuppressWarnings(String value[ ]) | 这个注解主要是用于去除一些警告,比如你某些变量可能没有用到,或者是你的某些容器没有添加泛型,编译器一般都会警告,用这个就可以消除; |
@param | 用来表明当前方法的参数 |
@Deprecated | 用来说明该方法已经不推荐使用(详细可以观看Date类源码,几乎全部被注解,除此之外这个注解也可以在javadoc文档中显示,可以观看API文档;) |
@deprecated | 该注解用来对方法进行介绍 |
@WebServlet(name=“”) | 其中的参数是String |
大部分注解只需要了解;
- 自定义注解
在官方的注解中,注解是这样定义的:
通过@interface,但是这不是接口;
public @interface myannotation {
int value();
}
这就相当于一种简单的自定义注解了;至于想用在哪里,目前也就了解一下,基本上在我看来,只要能够使用官方自带的注解就差不多了,这种自定义注解了解一下完全就OK;
4. 元注解
在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 中的注解特性
-
可重复注解:@Repeatable属于JDK8中才出现的;
首先要在需要重复定义的注解中使用注解@Repeatable修饰,而且其中要有参数;
这里就是要定义一个以需要重复注解的注解数组;方便上面的@Repeatable调用;
需要注意的点是: myannotation注解生命周期(@Retention要相同),以及他们的使用的修饰类型要相同(即@Target要相同),最后它们的继承性也要相同(即@Inherited要相同);
-
类型注解:就是指,可以直接使用注解,在各种类型前面;详情不做过多赘述,了解即可;
比如: