一、枚举

传统的方式:

•在某些情况下,一个类的对象是有限而且固定的。例如季节类,只能有 4 个对象
•手动实现枚举类:
—private 修饰构造器。
—属性使用 private final 修饰。
—把该类的所有实例都使用 public static final 来修饰。
练习代码:
 public class Season {

     //1、因为类的对象是固定的,所以类的属性是常量
public final String name;
public final String desc; //2、因为类的对象是有限个,所以不能在类的外部创建对象,构造器必须私有
private Season(String name,String desc){
this.name = name;
this.desc = desc;
} //3、在类的内部创建对象,但要在类的外部能够访问到该对象,而且还不能修改。
public static final Season SPRING = new Season("春天","春风又绿江南岸");
public static final Season SUMMER = new Season("夏天","映日荷花别样红");
public static final Season FALL = new Season("秋天","秋水共长天一色");
public static final Season WINTER = new Season("冬天","窗寒西岭千秋雪"); public String getName() {
return name;
}
public String getDesc() {
return desc;
} @Override
public String toString() {
return "Season [name=" + name + ", desc=" + desc + "]";
}
}

Season类

 public class TestSeason {

     public static void main(String[] args) {

         Season SPRING = Season.SPRING;
System.out.println(SPRING); }
}

TestSeason类

现在的方式:

•JDK 1.5 新增的 enum 关键字用于定义枚举类。
•枚举类和普通类的区别:
—使用 enum 定义的枚举类默认继承了 java.lang.Enum 类。
—枚举类的构造器只能使用 private 访问控制符。
—枚举类的所有实例必须在枚举类中显式列出(, 分隔    ; 结尾). 列出的实例系统会自动添加
   public static final 修饰。
—所有的枚举类都提供了一个 values 方法, 该方法可以很方便地遍历所有的枚举值。
•JDK 1.5 中可以在 switch 表达式中使用枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字,
  无需添加枚举类作为限定。
•若枚举只有一个成员, 则可以作为一种单子模式的实现方式。
 
注意枚举类的属性:
•枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰。
•枚举类使用 private final 修饰的属性应该在构造器中为其赋值。
•若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数。
 
实现接口的枚举类:
•和普通 Java 类一样枚举类可以实现一个或多个接口。
•若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 则可以让每个枚举值分别来实现该方法。
 (采用匿名内部类实现方法的重写)
 
枚举类的方法:
 
练习代码:
 public interface DateInfo {
public String getDateInfo();
}

DateInfo接口

 public enum Season2 implements DateInfo {

     SPRING("春天","春风又绿江南岸"){
@Override
public String getDateInfo() {
return "2-5";
}
},
SUMMER("夏天","映日荷花别样红"){
@Override
public String getDateInfo() {
return "5-8";
}
},
FALL("秋天","秋水共长天一色"){
@Override
public String getDateInfo() {
return "8-11";
}
},
WINTER("冬天","窗寒西岭千秋雪"){
@Override
public String getDateInfo() {
return "11-2";
}
},; private String name;
private String desc; private Season2(String name,String desc){
this.name = name;
this.desc = desc;
} public String getName() {
return name;
} public String getDesc() {
return desc;
} /* @Override 改为利用匿名内部类重写的方法更酷些
public String getDateInfo() {
System.out.println(this.toString().equals("SPRING"));
return null;
} */
}

Season2类继承接口DateInfo

 public class TestSeason {

     public static void main(String[] args) {

 //        Season SPRING = Season.SPRING;
// System.out.println(SPRING);
// System.out.println(Season2.SPRING);
for(Season2 s:Season2.values()){
// System.out.println(s);
// System.out.println(s.toString().equals("SPRING"));
System.out.println(s.getDateInfo());
} String str = "WINTER";
Season2 s = Season2.valueOf(Season2.class, str);
System.out.println(s.getName()+" "+s.getDesc());
}
}

TestSeason测试类

二、Annotation(注释)

1、概述:

•从 JDK 5.0 开始, Java 增加了对元数据(MetaData) 的支持, 也就是 Annotation(注释)。
•Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理.
 通过使用 Annotation, 程序员可以在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息。
•Annotation 可以像修饰符一样被使用, 可用于修饰包,类, 构造器, 方法, 成员变量, 参数, 局部变量的声明,
  这些信息被保存在 Annotation 的 “name=value” 对中。
•Annotation 能被用来为程序元素(类, 方法, 成员变量等) 设置元数据。

2、基本的 Annotation:

•使用 Annotation 时要在其前面增加 @ 符号, 并把该 Annotation 当成一个修饰符使用,
  用于修饰它支持的程序元素。
•三个基本的 Annotation:
— @Override: 限定重写父类方法, 该注释只能用于方法
— @Deprecated: 用于表示某个程序元素(类, 方法等)已过时
— @SuppressWarnings: 抑制编译器警告. 

3、自定义 Annotation:

•定义新的 Annotation 类型使用 @interface 关键字。
•Annotation 的成员变量在 Annotation 定义中以无参数方法的形式来声明. 其方法名和返回值定义了
  该成员的名字和类型。
•可以在定义 Annotation 的成员变量时为其指定初始值, 指定成员变量的初始值可使用 default 关键字。
•没有成员定义的 Annotation 称为标记; 包含成员变量的 Annotation 称为元数据 Annotation。
 
4、提取 Annotation 信息:
•JDK 5.0 在 java.lang.reflect 包下新增了 AnnotatedElement 接口, 该接口代表程序中可以
  接受注释的程序元素。
•当一个 Annotation 类型被定义为运行时 Annotation 后, 该注释才是运行时可见, 当 class 文件被载入时
  保存在 class 文件中的 Annotation 才会被虚拟机读取。
•程序可以调用 AnnotationElement 对象的如下方法来访问 Annotation 信息。
 
 
5、JDK 的元 Annotation:
•JDK 的元 Annotation 用于修饰其他 Annotation 定义
•@Retention: 只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 可以保留多长时间,
 @Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用 @Rentention 时必须为该 value 成员变量
    指定值:
–RetentionPolicy.CLASS: 编译器将把注释记录在 class 文件中. 当运行 Java 程序时,
  JVM 不会保留注释. 这是默认值。
–RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注释,
  程序可以通过反射获取该注释。
–RetentionPolicy.SOURCE: 编译器直接丢弃这种策略的注释。
•@Target: 用于修饰 Annotation 定义, 用于指定被修饰的 Annotation 能用于修饰哪些程序元素,
 @Target 也包含一个名为 value 的成员变量.
•@Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.
•@Inherited: 被它修饰的 Annotation 将具有继承性.如果某个类使用了被 @Inherited 修饰的 Annotation,
  则其子类将自动具有该注释.
 
练习例子:
 import java.lang.annotation.ElementType;
import java.lang.annotation.Target; /**
* 1. 使用 @interface 定义注解
* 2. 使用类似于接口方法声明的方式来定义注解的属性: 其中返回值称为属性的类型, 方法名为属性的名称.
*
*/
@Target(value={ElementType.METHOD, ElementType.TYPE})
public @interface HelloAnnotation { public String name() default "atguigu"; }

@interface与@Target用法

 public class TestAnnotation {

     @SuppressWarnings("unused")
public static void main(String[] args) { A a = new A();
a.method2(); String str = "abc";
}
} @HelloAnnotation(name="abc")
class A{ @HelloAnnotation()
void method1(){} @Deprecated
void method2(){} } class B extends A{ @Override
void method1(){} }

TestAnnotation类

 
 
 

复习java第五天(枚举、Annotation(注释) 概述)的更多相关文章

  1. JAVA提高五:注解Annotation

    今天我们学习JDK5.0中一个非常重要的特性,叫做注解.是现在非常流行的一种方式,可以说因为配置XML 比较麻烦或者比容易查找出错误,现在越来越多的框架开始支持注解方式,比如注明的Spring 框架, ...

  2. [Java核心技术]五-继承(枚举类)

    ####Java枚举类型(enum) 枚举类型都是继承了Enum类(是一个抽象类)的一个类,我们可以向enum类中添加方法和变量等.编译再反编译可以看到枚举类型对应的类的内容. 每个枚举常量都对应一个 ...

  3. java JDK8 学习笔记——第18章 自定义泛型、枚举与注释

    第十八章 自定义泛型.枚举与注释 18.1 自定义泛型 泛型定义: (1)仅定义在方法上的泛型语法 (2)用来限制泛型可用类型的extends与super关键字(3)?类型通配字符的使用 18.1.1 ...

  4. 和朱晔一起复习Java并发(五):并发容器和同步器

    本节我们先会来复习一下java.util.concurrent下面的一些并发容器,然后再会来简单看一下各种同步器. ConcurrentHashMap和ConcurrentSkipListMap的性能 ...

  5. Java学习笔记:注解Annotation

    annotation的概念 In the Java computer programming language, an annotation is a form of syntactic metada ...

  6. 【java】详解java中的注解(Annotation)

    目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...

  7. 【转载:java】详解java中的注解(Annotation)

    目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...

  8. java基础源码 (3)--Annotation(注解)

    借鉴博客地址:https://www.cnblogs.com/skywang12345/p/3344137.html /** * The common interface extended by al ...

  9. java的五种数据类型解析

    不知道大家对java的简单数据类型是否了解,下面针对Java的五种类型简单数据类型表示数字和字符,进行详细的讲解和分析. 一.简单数据类型初始化 在Java语言中,简单数据类型作为类的成员变量声明时自 ...

随机推荐

  1. BZOJ 3732 Network 【模板】kruskal重构树

    [题解] 首先,我们可以发现,A到B的所有路径中,最长边的最小值一定在最小生成树上.我们用Kruskal最小生成树时,假设有两个点集U,V,若加入一条边w(u,v)使U,V联通,那么w就是U中每个点到 ...

  2. 【郑轻邀请赛 D】hipercijevi

    [题目链接]:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2130 [题意] [题解] 把那个管泛化成一个点; 然后把每一个在管里面的点都和它相连 ...

  3. (44). Spring Boot日志记录SLF4J【从零开始学Spring Boot】

    在开发中打印内容,使用 System.out.println() 和 Log4j 应当是人人皆知的方法了. 其实在开发中我们不建议使用 System.out 因为大量的使用 System.out 会增 ...

  4. sql server的数据库个数、表个数及表的数据量统计

    sql server的数据库个数.表个数及表的数据量统计   --由于今天要监控数据,急需统计实例中1有多少库2库里有多少表3每个表有多少数据 --将写好的代码贴出来,用到如下的: --sysobje ...

  5. C - Reading comprehension 二分法 求等比数列前N项和

    Read the program below carefully then answer the question. #pragma comment(linker, "/STACK:1024 ...

  6. What you can talk

    data buffer who locked the account hash join cost memory and nested loop do not. How to make it hash ...

  7. Intellij Idea 13:重置设置

    最近在将Windows下的Idea的设置导入到Mac下的时候,一时手贱,点了全部结果发现悲剧了,所有的快捷键都变成和Windows的一样了.于是我就在CMD+C,V和Ctrl+C,V中不断的进行头脑锻 ...

  8. XMPP基本内容简单介绍

    即时通讯技术简单介绍 即时通讯技术(IM)支持用户在线实时交谈.假设要发送一条信息,用户须要打开一个小窗体,以便让用户及其朋友在当中输入信息并让交谈两方都看到交谈的内容.有很多的IM系统,如AOL I ...

  9. acdream 1414 Geometry Problem

    Geometry Problem Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)    ...

  10. hdu 4704(费马小定理+快速幂取模)

    Sum                                                                                Time Limit: 2000/ ...