复习java第五天(枚举、Annotation(注释) 概述)

一、枚举

传统的方式:

?在某些情况下,一个类的对象是有限而且固定的。例如季节类,只能有 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 定义

[email protected]: 只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 可以保留多长时间,

@Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用 @Rentention 时必须为该 value
成员变量

指定值:

–RetentionPolicy.CLASS: 编译器将把注释记录在 class 文件中. 当运行 Java
程序时,

JVM 不会保留注释. 这是默认值。

–RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中. 当运行
Java 程序时, JVM 会保留注释,

程序可以通过反射获取该注释。

–RetentionPolicy.SOURCE: 编译器直接丢弃这种策略的注释。

?@Target: 用于修饰 Annotation 定义,
用于指定被修饰的 Annotation 能用于修饰哪些程序元素,

@Target 也包含一个名为 value 的成员变量.

[email protected]: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.

[email protected]: 被它修饰的 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(注释) 概述),布布扣,bubuko.com

时间: 2024-12-11 18:13:12

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

Java【第十五章】Annotation注释

[第十五章]Annotation注释 一.Annotation注释: Annotation可以有效的减少程序配置的代码,并且可以利用Annation进行一些结构化的定义. Annotatin是以一种注解的形式实现的程序开发,可以节约大量的程序代码,只不过开发难度较高. 如果想清楚Annotation的产生意义,则必须了解程序开发结构的历史,从历史上来讲,程序开发分为三个过程. (1)过程一: 在程序定义的时候将所有可能使用的服务器资源定义在程序代码之中. 1.如果此时服务器相关地址发生改变,那么

Java语言中的----枚举

day08 Java语言中的----枚举 一.概述: 什么是枚举?枚举有什么作用?我们又如何来使用这个枚举.其实枚举就是不可变的一些成员变量,比如:春夏秋冬.年.十二个月.颜色等等.都是一些固定的常量值.是用来创建预定义列表.枚举是和类是一个级别的.可以直接以类的方式来定义,也可以定义在类里面.同时也可以在定义枚举里面定义方法.变量.构造函数等等. 二.枚举: 实例一:         package www.com;                  //定义一个枚举.         enu

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

第十八章 自定义泛型.枚举与注释 18.1 自定义泛型 泛型定义: (1)仅定义在方法上的泛型语法 (2)用来限制泛型可用类型的extends与super关键字(3)?类型通配字符的使用 18.1.1 使用extends与? 1.若extends之后指定了类与接口,想再指定其他接口,可以使用&连接. 2.如果B是A的子类,而Node< B>可视为一种Node< A>,则称Node具有共变性或有弹性的.Java泛型不具有共变性,可以使用类型通配字符?与extends来声明变量

Java Annotation注释机制

简介 Annotation 提供了一条与程序元素关联任何信息或者任何元数据(metadata)的途径.从某些方面看,annotation就像修饰符一样被使用,并应用于包.类型.构造方法.方法.成员变量.参数.本地变量的声明中.这些信息被存储在annotation的"name=value"结构对中. annotation类型是一种接口,能够通过java反射API的方式提供对其信息的访问. annotation能被用来为某个程序元素(类.方法.成员变量等)关联任何的信息.需要注意的是,这里

java学习笔记(五)枚举

原文出处:http://www.cnblogs.com/linjiqin/archive/2011/02/11/1951632.html 在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的"数据集",春夏秋冬四个数据元素组成了四季的"数据集". 在java中如何更好的使用这些"数据集"呢?因此枚举便派上了用场,以

JAVA首选五款开源Web开发框架

Spring Spring是一个开源的Java/Java EE全功能栈应用程序框架,在JavaEE社区中非常受欢迎,以Apache许可证形式发布,也有.NET平台上的移植版本. Struts2 Struts2是一个web应用框架.它不是一个Struts的新的发布版本,而是一个全新的框架.Struts2是第二代基于Model-View-Controller (MVC)模型的web应用框架.Struts2是java企业级web应用的可扩展性的框架.它是WebWork和Struts社区合并后的产物.这

java攻城师之路--复习java web之jsp入门_El表达式_JSTL标签库

JSP 技术掌握:JSP语法 + EL + JSTL 为什么sun推出 JSP技术 ? Servlet 生成网页比较复杂,本身不支持HTML语法,html代码需要通过response输出流输出,JSP支持HTML语法,生成HTML方便. JSP技术与Servlet 技术区别和关系?JSP和Servlet技术都是用来动态生成网页的,Servlet不支持HTML语法,生成网页麻烦,JSP支持HTML语法,生成网页方便,JSP运行时翻译Servlet 执行的.JSP 就是 Servlet . JSP运

复习java基础第二天(异常处理)

一.常见的异常类型: public class TestException { public static void main(String[] args) { int i = 10; //数学异常: java.lang.ArithmeticException int j = i / 0; System.out.println(j); int [] scores = new int[]{1, 2, 4, 5}; //数组下标越界异常: java.lang.ArrayIndexOutOfBound

java的五种数据类型解析

不知道大家对java的简单数据类型是否了解,下面针对Java的五种类型简单数据类型表示数字和字符,进行详细的讲解和分析. 一.简单数据类型初始化 在Java语言中,简单数据类型作为类的成员变量声明时自动初始化为默认值,除非显式地声明.简单数据类型为某一方法声明局部变量时不会自动地初始化而且会导致编译器扔出类似以下的错误消息"Variable x may not have been initialized.(x变量没有初始化)"表B定义了Java简单数据类型的默认值. 二.封装类 1av