java基础笔记-枚举类,注解
八 枚举类&注解
这俩都是JDK5.0加进去的。彼此没啥关系
1.枚举类
啥是枚举啊,一个一个数呗
类的对象个数是有限的,确定个数的,比如星期,性别,季节
当需要定义一组的常量时,强烈建议使用枚举类!!!
1.1 JDK5之前 自定义
class Season{
//1. 属性都final
private final String name;
//2.私有化构造方法
private Season(String name){
this.name=name;
}
//3.提供枚举的所有对象 ,public提供对外访问,static保证可以直接调用,final防止修改
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("冬天");
//4.可以提供get方法,可以修改toString方法
}
1.2 JDK5 之后 enum
enum关键字来定义枚举类
enum Season{
//1.提供枚举的所有对象,对象之间用逗号,结尾用分号
// public static final Season SPRING=new Season("春天"); 对比,能省的都省掉
SPRING("春天"),
SUMMER("夏天"),
AUTUMN("秋天"),
WINTER("冬天");
//2. 属性都final
private final String name;
//3.私有化构造方法
private Season(String name){
this.name=name;
}
//4.可以提供get方法
//一般toString方法不用重写,enum默认父类是java.lang.Enum,这里面重写了,输出是对象名
}
1.3Enum类的方法
Season[] values = Season.values();//所有类的数组
//返回指定名的对象
Season season = Season.valueOf("WINTER");//找不到报异常!
winter.toString();
1.4 enum枚举类使用接口
公共的抽象方法
enum Sex implements Info{
MAN,
WOMAN;
//情况1:实现抽象方法
@override
public void show(){sout("sdfsd");}
}
interface Info{
void show();
}
每个对象单独重写抽象方法
enum Sex implements Info{
MAN{
@Override
public void show() {
System.out.println("nande");
}
},
WOMAN{
@Override
public void show() {
System.out.println("nude ");
}
};
}
interface Info{
void show();
}
2.注解 Annotation *
JDK5.0时新增
Annotation,其实就是代码中的特殊标记,这些标记会被编译
Test Override version param author
可以认为:框架=注解+反射+设计模式
2.1 常见注解
//生成文档的注解
@author
@version
@see
@date
//这三个只能用于方法
@exception
@return
@param
//编译时的格式检查
@Override //检查重写的格式对不对
@Deprecated //标识过时了,但是能用
@SuppressWarnings({"unused","rawtypes"}) //抑制编译器警告
//跟踪代码依赖性,实现代替配置文件的功能
@WebSerlet("/login")
@Transaction(....)
//单元测试
@Test
@After
@Before
2.2 自定义注解
? 一般不用,用现成的多好
如果自定义类没有成员,表明这是一个标识作用
注解有啥用了,配合反射(信息处理流程),读取注解
public @interface MyAnnotation {
String values() default "hello";//这是个属性
//类型只能是String,Class ,enum ,Annotation 以及他们的数组类型
}
@MyAnnotation("hhh")
class Person{
@MyAnnotation
public void fun(){}
...
}
2.3 JDK 4种元注解
修饰其他注解的注解
2.3.1 Retention()
只能所修饰的注解的生命周期
表示一直保留到哪个阶段:
SOURSCE , CLASS(默认) , RUNTIME
如果需要反射调用,则要设置为RUNTIME
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
...
}
2.3.2 Target
用于指定被修饰的Annotation能修饰在哪些地方(方法,局部变量,类)
TYPE , FIELD , METHOD , PARAMETER , CONSTRUCTOR , LOCALA_VARIABLE
@Terget(METHOD)
2.3.3 Documented
用于指定被该元注解修饰的Annotation类将被javadoc工具提取成文档,默认情况javadoec是不包括注解的
想要设置@Documented,必须@Tetention(RetentionPolicy.RUNTIME)
最常见的就是@Deprecated 能在文档里看到某些方法是提示过时的
2.3.4 Inherited
被修饰的注解就可以被继承了
说的是class中,子类能继承父类的注解
不是Annotation,注解本身能继承
2.5 J8注解新特性
2.5.1 可重复注解
@MyAnnotation(value="hi")
@MyAnnotation(Value="hh")
public class Person{
...
}
@Repeatable(MyAnnotations.class)
@Target({ ... })
@Retention({... })
public @interface MyAnnotation{
String value;
}
@Target({ ... }) //Target,Retention,Inherited和上面要相同
@Retention({... })
public @interface MyAnnotations{
MyAnnotation[] value;
}
JDK8之前的写法:
@MyAnnotations({@MyAnnotation(value="hi"),@MyAnnotation(Value="hh")})
public class Person{
...
}
public @interface MyAnnotations{
MyAnnotation[] value;
}
public @interface MyAnnotation{
String value;
}
2.5.2 类型注解 这里写的好像不对。。。慎看
TYPE_PARAMETER
用在Target里面的,表示Target修饰的注解可以写在类型比那辆的声明语句中,、
TYPE_USE
用在Target里面的,表示Target修饰的注解可以写在使用类型的任何语句中
比如泛型,String,基本数据类型,Integer,异常类型
class Person<@MyAnnotation T> throws @MyAnnotation RunTimeException{
int num=(@MyAnnotation int) 10L;
ArrayList<>
}
@Target({,TYPE_USE,TYPE_PARAMETER})
public @interface MyAnnotation{
}