一、枚举

传统的方式:

•在某些情况下,一个类的对象是有限而且固定的。例如季节类,只能有 4 个对象
•手动实现枚举类:
—private 修饰构造器。
—属性使用 private final 修饰。
—把该类的所有实例都使用 public static final 来修饰。
练习代码:
  1. public class Season {
  2.  
  3. //1、因为类的对象是固定的,所以类的属性是常量
  4. public final String name;
  5. public final String desc;
  6.  
  7. //2、因为类的对象是有限个,所以不能在类的外部创建对象,构造器必须私有
  8. private Season(String name,String desc){
  9. this.name = name;
  10. this.desc = desc;
  11. }
  12.  
  13. //3、在类的内部创建对象,但要在类的外部能够访问到该对象,而且还不能修改。
  14. public static final Season SPRING = new Season("春天","春风又绿江南岸");
  15. public static final Season SUMMER = new Season("夏天","映日荷花别样红");
  16. public static final Season FALL = new Season("秋天","秋水共长天一色");
  17. public static final Season WINTER = new Season("冬天","窗寒西岭千秋雪");
  18.  
  19. public String getName() {
  20. return name;
  21. }
  22. public String getDesc() {
  23. return desc;
  24. }
  25.  
  26. @Override
  27. public String toString() {
  28. return "Season [name=" + name + ", desc=" + desc + "]";
  29. }
  30. }

Season类

  1. public class TestSeason {
  2.  
  3. public static void main(String[] args) {
  4.  
  5. Season SPRING = Season.SPRING;
  6. System.out.println(SPRING);
  7.  
  8. }
  9. }

TestSeason类

现在的方式:

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

DateInfo接口

  1. public enum Season2 implements DateInfo {
  2.  
  3. SPRING("春天","春风又绿江南岸"){
  4. @Override
  5. public String getDateInfo() {
  6. return "2-5";
  7. }
  8. },
  9. SUMMER("夏天","映日荷花别样红"){
  10. @Override
  11. public String getDateInfo() {
  12. return "5-8";
  13. }
  14. },
  15. FALL("秋天","秋水共长天一色"){
  16. @Override
  17. public String getDateInfo() {
  18. return "8-11";
  19. }
  20. },
  21. WINTER("冬天","窗寒西岭千秋雪"){
  22. @Override
  23. public String getDateInfo() {
  24. return "11-2";
  25. }
  26. },;
  27.  
  28. private String name;
  29. private String desc;
  30.  
  31. private Season2(String name,String desc){
  32. this.name = name;
  33. this.desc = desc;
  34. }
  35.  
  36. public String getName() {
  37. return name;
  38. }
  39.  
  40. public String getDesc() {
  41. return desc;
  42. }
  43.  
  44. /* @Override 改为利用匿名内部类重写的方法更酷些
  45. public String getDateInfo() {
  46. System.out.println(this.toString().equals("SPRING"));
  47. return null;
  48. } */
  49. }

Season2类继承接口DateInfo

  1. public class TestSeason {
  2.  
  3. public static void main(String[] args) {
  4.  
  5. // Season SPRING = Season.SPRING;
  6. // System.out.println(SPRING);
  7. // System.out.println(Season2.SPRING);
  8. for(Season2 s:Season2.values()){
  9. // System.out.println(s);
  10. // System.out.println(s.toString().equals("SPRING"));
  11. System.out.println(s.getDateInfo());
  12. }
  13.  
  14. String str = "WINTER";
  15. Season2 s = Season2.valueOf(Season2.class, str);
  16. System.out.println(s.getName()+" "+s.getDesc());
  17. }
  18. }

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,
  则其子类将自动具有该注释.
 
练习例子:
  1. import java.lang.annotation.ElementType;
  2. import java.lang.annotation.Target;
  3.  
  4. /**
  5. * 1. 使用 @interface 定义注解
  6. * 2. 使用类似于接口方法声明的方式来定义注解的属性: 其中返回值称为属性的类型, 方法名为属性的名称.
  7. *
  8. */
  9. @Target(value={ElementType.METHOD, ElementType.TYPE})
  10. public @interface HelloAnnotation {
  11.  
  12. public String name() default "atguigu";
  13.  
  14. }

@interface与@Target用法

  1. public class TestAnnotation {
  2.  
  3. @SuppressWarnings("unused")
  4. public static void main(String[] args) {
  5.  
  6. A a = new A();
  7. a.method2();
  8.  
  9. String str = "abc";
  10. }
  11. }
  12.  
  13. @HelloAnnotation(name="abc")
  14. class A{
  15.  
  16. @HelloAnnotation()
  17. void method1(){}
  18.  
  19. @Deprecated
  20. void method2(){}
  21.  
  22. }
  23.  
  24. class B extends A{
  25.  
  26. @Override
  27. void method1(){}
  28.  
  29. }

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. 30.IK中文分词器的安装和简单使用

    在之前我们学的都是英文,用的也是英文的standard分词器.从这一节开始,学习中文分词器.中国人基本上都是中文应用,很少是英文的,而standard分词器是没有办法对中文进行合理分词的,只是将每个中 ...

  2. 百度编辑器ueditor1.4.3配置记录

    我从官网下载的php文件,但是图片上传不能用,后来查找资料,打开ueditor下的php/controller.php,(其他环境选对应的文件夹)把时区设置按如下改个字母大小写,再打开该文件就正确返回 ...

  3. Redis学习总结(1)——Redis内存数据库详细教程

    1.redis是什么 2.redis的作者何许人也 3.谁在使用redis 4.学会安装redis 5.学会启动redis 6.使用redis客户端 7.redis数据结构 – 简介 8.redis数 ...

  4. Sencha Touch中 xclass和xtype区别

    1.xclass 就是 Ext.create(xclass) 和 xtype一样的性质,不一定非要是自己创建的. 2.xtype是xclass的简称. 3.使用xtype前,你要new的对象,先要re ...

  5. 嵌入式linux和嵌入式android系统有什么区别和联系?

    转自:http://bbs.eeworld.com.cn/thread-430437-1-1.html 这个问题很多人问,尤其是初入嵌入式的菜鸟.其实大家都认为android是java,已经不是lin ...

  6. Linux进程线程学习笔记:运行新程序

    Linux进程线程学习笔记:运行新程序                                         周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下 ...

  7. 记一次ruby的安装

    1,下载rubyinstall 安装包及devkit包 登陆网站 :http://rubyinstaller.org/downloads/ 安装rubyinstall包时添加到环境变量 2,安装完in ...

  8. Oracle数据库点滴

    分页查询: SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40)W ...

  9. firedac的TFDStoredProc动态创建并调用存储过程

    1)中间件执行存储过程 sp.Close; sp.StoredProcName := procName; sp.Prepare;  // 生成存储过程的参数列表,无任何OUTPUT的存储过程,也会自动 ...

  10. HDU 5467

    第一次写LCT,各种模板加入...以后都只遇到有新意的题目再更新了 这道题就是LCT,但是,难在一个回退的操作.这时,可以通过改变执行顺序,先把要回退后再做的操作先执行了,再回退到之前的执行.这时,建 ...