1.枚举类(Enum)
Enum和class , interface是同等地位的
用来定义一组有限个常量的时候经常使用
1.枚举值必须定义在第一行
2.不同值之间用逗号隔开,最后一个以分号结尾
Enum常用方法:
values() 返回的是枚举类名称的一个数组。
valueOf("asd") 返回值是名字为asd的枚举对象,没有这个值的话会报错。
public class play{
public static void main(String[] args){
System.out.println(season.qwe); 等于说是调用了toString,还可以重写这个方法
season[] values = season.values();
for(season i : values)
System.out.println(i);
}
}
enum season{
qwe("dong") , asd("nan");
private String name;
private season(String string) {
this.name = string;
}
}
2.注解(Annotation)
注解就是特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。
@Override 限定重写父类方法,不重写的话就会报错
@Deprecated 表示所修饰的元素已过时,但是还可以使用
@SuppressWarnings("值") 抑制编辑器警告,当有多个的时候,可以用大括号将其括起来
@SuppressWarnings( "unused" )
@SuppressWarnings( {"unused" , "rawtypes"} )
unused 忽略定义值未使用时的警告
rawtypes 忽略未限制泛型类型时的警告
boxing 忽略装箱拆箱产生的警告
all 忽略所有警告
自定义注解
自定义注解必须配上反射,才有意义
@interface Myannocation{
String value() default "String";
}
元注解
对现有的注解进行标注的注解
学后期框架的时候用的比较多
@Retention("value") 用于修饰一个annotation,用于指定annotation的生命周期,经常用
value是枚举类RetentionPolicy中的值
SOURCE 该注解只保存在源代码(.java)中,编译后不报存在类文件(.class)内
CLASS 编译器将注解保存在类文件内,范式JVM不会加载这个注解。默认值就是这个
RUNTIME 记录在类文件内,JVM也会加载,并且可以通过反射获取注解信息
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.SOURCE)
@interface Myannocation{
String value();
}
@Target("value") 用于修饰定义的接口可以试用哪些类型,经常用
需要用大括号括起来
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Target({ElementType.TYPE , ElementType.FIELD})
@Retention(RetentionPolicy.SOURCE)
@interface Myannocation{
String value();
}
java.lang.annotation.ElementType | 内的枚举值 |
---|---|
CONSTRUCTOR | 用于构造方法 |
FIELD | 成员变量 |
LOCAL_VARIABLE | 局部变量 |
METHOD | 方法 |
PACKAGE | 包 |
PARAMETER | 参数声明 |
TYPE | 类,接口,枚举 |
ANNOTATION_TYPE | 注解声明 |
@Document 表示被修饰的注解会被javadoc.Java提取成文档
@Inherited 表示父类的注解将被子类继承,不经常用
jdk8新增注解:
@Repeatable()
1.先定义两个自定义注解,a 和 b
2.a内写上@Repeatable(b.class)
3.a和b的元注解必须一致
4.a类的内部是一个正常的String value();
5.b内部是一个a类型数组a[] value();
6.然后a注解就可以多次修饰同一个东西了
@Repeatable(b.class)
@Target({ElementType.TYPE , ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.CLASS)
@interface a{
String value();
}
@Target({ElementType.TYPE , ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.CLASS)
@interface b{
a[] value();
调用:
public class play{
public static void main(String[] args){
@a("nih")
@a("cnm") 这里a注解可以用多次
int d = 10;
}
}
类型注解
使用位置:创建对象,方法参数,类型转换,throws抛异常,implements实现接口等
java.lang.annotation.ElementType | 内的枚举值 |
---|---|
TYPE_PARAMETER | 表示该注解能写在类型变量的声明语句中(泛型声明) |
TYPE_USE | 表示该注解能写在使用类型的任何语句中 |
@Target(ElementType.TYPE_PARAMETER)
@interface a{
String value() defaule "qwe";
}
class test<@a T>{ 在内部修饰
}
@Target(ElementType.TYPE_USE)
@interface a{
String value() default "qwe";
}
class test<T>{ 在很多地方都能用了
public void show() throws @a Exception{
ArrayList<@a String> List = new ArrayList<>();
int num = (@a int) 10L;
}
}