枚举类
自定义枚举
public class SeasonTest {
public static void main ( String [ ] args) {
Season spring = Season . SPRING ;
System . out. println ( spring) ;
System . out. println ( spring. toString ( ) ) ;
System . out. println ( spring. getSeasonName ( ) ) ;
}
}
class Season {
private final String seasonName;
private final String seasonDesc;
private Season ( String seasonName, String seasonDesc) {
this . seasonName = seasonName;
this . seasonDesc = seasonDesc;
}
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 ( "冬天" , "冰天雪地" ) ;
public String getSeasonName ( ) {
return seasonName;
}
public String getSeasonDesc ( ) {
return seasonDesc;
}
@Override
public String toString ( ) {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}' ;
}
}
enum枚举
* toString ( ) : 返回枚举类对象的名称
* values ( ) : 返回所有的枚举类对象构成的数组
* valueOf ( String objName) : 返回枚举类中对象名是objName的对象。
public class SeasonTest1 {
public static void main ( String [ ] args) {
Season1 spring = Season1 . SPRING ;
System . out. println ( spring. toString ( ) ) ;
System . out. println ( spring. getSeasonName ( ) ) ;
System . out. println ( "****************" ) ;
Season1 [ ] values = Season1 . values ( ) ;
for ( Season1 value : values) {
System . out. println ( value) ;
System . out. println ( value. getSeasonName ( ) ) ;
}
System . out. println ( "****************" ) ;
Season1 winter = Season1 . valueOf ( "WINTER" ) ;
System . out. println ( winter. getSeasonName ( ) ) ;
}
}
enum Season1 {
SPRING ( "春天" , "春暖花开" ) ,
SUMMER ( "夏天" , "夏日炎炎" ) ,
AUTUMN ( "秋天" , "秋高气爽" ) ,
WINTER ( "冬天" , "冰天雪地" ) ;
private final String seasonName;
private final String seasonDesc;
private Season1 ( String seasonName, String seasonDesc) {
this . seasonName = seasonName;
this . seasonDesc = seasonDesc;
}
public String getSeasonName ( ) {
return seasonName;
}
public String getSeasonDesc ( ) {
return seasonDesc;
}
}
继承接口
interface Info {
void show ( ) ;
}
enum Season1 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 ( "大约在冬季" ) ;
}
} ;
注解
理解Annotation
* ① jdk 5.0 新增的功能
*
* ② Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理。通过使用 Annotation ,
* 程序员可以在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息。
*
* ③在JavaSE 中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE / Android
* 中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE 旧版中所遗留的繁冗
* 代码和XML 配置等。
Annocation的使用示例
在编译时进行格式检查( JDK 内置的三个基本注解)
@Override : 限定重写父类方法, 该注解只能用于方法
@Deprecated : 用于表示所修饰的元素( 类, 方法等) 已过时。通常是因为所修饰的结构危险或存在更好的选择
@SuppressWarnings : 抑制编译器警告
如何自定义注解:参照@SuppressWarnings定义
* ① 注解声明为:@interface
* ② 内部定义成员,通常使用value表示
* ③ 可以指定成员的默认值,使用default 定义
* ④ 如果自定义注解没有成员,表明是一个标识作用。
如果注解有成员,在使用注解时,需要指明成员的值。
自定义注解必须配上注解的信息处理流程( 使用反射) 才有意义。
自定义注解通过都会指明两个元注解:Retention 、Target
@Inherited
@Retention ( RetentionPolicy . RUNTIME )
@Target ( { TYPE , FIELD , METHOD , PARAMETER , CONSTRUCTOR , LOCAL_VARIABLE , TYPE_PARAMETER , TYPE_USE } )
public @interface MyAnnotation {
String value ( ) default "hello" ;
}
jdk 提供的4种元注解
元注解:对现有的注解进行解释说明的注解
Retention :指定所修饰的 Annotation 的生命周期:SOURCE \CLASS (默认行为)\RUNTIME
只有声明为RUNTIME 生命周期的注解,才能通过反射获取。
Target : 用于指定被修饰的 Annotation 能用于修饰哪些程序元素
* * * * * * * 出现的频率较低* * * * * * *
Documented : 表示所修饰的注解在被javadoc解析时,保留下来。
Inherited : 被它修饰的 Annotation 将具有继承性。
jdk8新特性-注解
可重复注解
① 在MyAnnotation 上声明@Repeatable ,成员值为MyAnnotations . class
② MyAnnotation 的Target 和Retention 等元注解与MyAnnotations 相同。
@Inherited
@Repeatable ( MyAnnotations . class )
@Retention ( RetentionPolicy . RUNTIME )
@Target ( { TYPE , FIELD , METHOD , PARAMETER , CONSTRUCTOR , LOCAL_VARIABLE , TYPE_PARAMETER , TYPE_USE } )
public @interface MyAnnotation {
String value ( ) default "hello" ;
}
@Inherited
@Retention ( RetentionPolicy . RUNTIME )
@Target ( { TYPE , FIELD , METHOD , PARAMETER , CONSTRUCTOR , LOCAL_VARIABLE } )
public @interface MyAnnotations {
MyAnnotation [ ] value ( ) ;
}
@MyAnnotation ( value= "hi" )
@MyAnnotation ( value= "abc" )
类型注解
关于@Target 新增的类型:
ElementType . TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如:泛型声明)。
ElementType . TYPE_USE 表示该注解能写在使用类型的任何语句中。
class Generic < @MyAnnotation T > {
public void show ( ) throws @MyAnnotation RuntimeException {
ArrayList < @MyAnnotation String > list = new ArrayList < > ( ) ;
int num = ( @MyAnnotation int ) 10L ;
}
}