java-Junit 注解 枚举

发布时间 2023-11-18 14:20:17作者: 索静丨LLH

第15章_Junit_注解_枚举

Junit单元测试

引入

【1】软件测试的目的:

软件测试的目的是在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。 

【2】测试分类:

(1)黑盒测试:

软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试又叫功能测试。

(2)白盒测试:---》Junit属于白盒测试。

软件的白盒测试是对软件的过程性细节做细致的检查。这种方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序的所有逻辑路径进行测试,通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。因此白盒测试又称为结构测试。

  

没有Junit的情况下如何测试

在没有使用Junit的时候,缺点:

(1)测试一定走main方法,是程序的入口,main方法的格式必须不能写错。

(2)要是在同一个main方法中测试的话,那么不需要测试的东西必须注释掉。

(3)测试逻辑如果分开的话,需要定义多个测试类,麻烦。

(4)业务逻辑和测试代码,都混淆了。

代码:

 1 public class Calculator {
 2     //加法:
 3     public int add(int a,int b){
 4         return a+b;
 5     }
 6     //减法:
 7     public int sub(int a,int b){
 8         return a-b;
 9     }
10 }
 1 public class Test {
 2     //这是一个main方法,是程序的入口:
 3     public static void main(String[] args) {
 4         //测试加法:
 5         Calculator cal = new Calculator();
 6         int result = cal.add(10, 20);
 7         System.out.println(result);
 8         //测试减法:
 9        /* int result = cal.sub(30, 10);
10         System.out.println(result);*/
11     }
12 }
1 public class Test02 {
2     //这是一个main方法,是程序的入口:
3     public static void main(String[] args) {
4         Calculator cal = new Calculator();
5         //测试减法:
6         int result = cal.sub(30, 10);
7         System.out.println(result);
8     }
9 }

 

Junit的使用

【1】一般测试和业务做一个分离,分离为不同的包:

建议起名:公司域名倒着写+test

以后测试类就单独放在这个包下

【2】测试类的名字:****Test  --->见名知意

【3】测试方法的定义--》这个方法可以独立运行,不依托于main方法

建议:

名字:testAdd()    testSub()   见名知意

参数:无参

返回值:void

 

【4】测试方法定义完以后,不能直接就独立运行了,必须要在方法前加入一个注解:   @Test

【5】导入Junit的依赖的环境:

 

【6】代码:

 1 package com.llh;
 2 
 3 import com.llh.calculator.Calculator;
 4 import org.junit.Test;
 5 
 6 public class CalculatorTest {
 7     //测试add方法
 8     @Test
 9     public void testAdd(){
10         System.out.println("测试add方法");
11         Calculator cal = new Calculator();
12         int result = cal.add(10, 30);
13         System.out.println(result);
14     }
15     //测试sub方法
16     @Test
17     public void testSub(){
18         System.out.println("测试sub方法");
19         Calculator cal = new Calculator();
20         int result = cal.sub(10, 30);
21         System.out.println(result);
22     }
23 }

 

【7】判定结果:

绿色:正常结果

红色:出现异常

【8】即使出现绿色效果,也不意味着你的测试就通过了,因为代码中逻辑也可能出现问题,这种情况怎么解决呢?

加入断言

 1 package com.llh;
 2 
 3 import com.llh.calculator.Calculator;
 4 import org.junit.Assert;
 5 import org.junit.Test;
 6 
 7 
 8 public class CalculatorTest {
 9     //测试add方法
10     @Test
11     public void testAdd(){
12         System.out.println("测试add方法");
13         Calculator cal = new Calculator();
14         int result = cal.add(10, 30);
15         //System.out.println(result);--》程序的运行结果可以不关注
16         //加入断言:预测一下结果,判断一下我预测的结果和 实际的结果是否一致:
17         Assert.assertEquals(40,result);//第一个参数:预测结果  第二个参数:实际结果
18     }
19     //测试sub方法
20     @Test
21     public void testSub(){
22         System.out.println("测试sub方法");
23         Calculator cal = new Calculator();
24         int result = cal.sub(10, 30);
25         System.out.println(result);
26     }
27 }

 

@Before_@After

@Before:

某一个方法中,加入了@Before注解以后,那么这个方法中的功能会在测试方法执行前先执行

一般会在@Beforer修饰的那个方法中加入:加入一些申请资源的代码:申请数据库资源,申请IO资源,申请网络资源。。。

 

 

@After:

某一个方法中,加入了@After注解以后,那么这个方法中的功能会在测试方法执行后先执行

一般会在@After修饰的那个方法中加入:加入释放资源的代码:释放数据库资源,释放IO资源,释放网络资源。。。

 

代码:

 1 package com.llh;
 2 
 3 import com.llh.calculator.Calculator;
 4 import org.junit.After;
 5 import org.junit.Assert;
 6 import org.junit.Before;
 7 import org.junit.Test;
 8 
 9 public class CalculatorTest {
10     @Before
11     public void init(){
12         System.out.println("方法执行开始了。。。");
13     }
14     @After
15     public void close(){
16         System.out.println("方法执行结束了。。。");
17     }
18     //测试add方法
19     @Test
20     public void testAdd(){
21         System.out.println("测试add方法");
22         Calculator cal = new Calculator();
23         int result = cal.add(10, 30);
24         //System.out.println(result);--》程序的运行结果可以不关注
25         //加入断言:预测一下结果,判断一下我预测的结果和 实际的结果是否一致:
26         Assert.assertEquals(40,result);//第一个参数:预测结果  第二个参数:实际结果
27     }
28     //测试sub方法
29     @Test
30     public void testSub(){
31         System.out.println("测试sub方法");
32         Calculator cal = new Calculator();
33         int result = cal.sub(10, 30);
34         System.out.println(result);
35     }
36 }

 

注解

 

引入

【1】历史:

JDK5.0 新增 ---  注解(Annotation),也叫元数据

【2】什么是注解?

注解其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用注解,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。

使用注解时要在其前面增加@符号,并把该注解当成一个修饰符使用。用于修饰它支持的程序元素。

【3】注解的重要性:

Annotation 可以像修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明,这些信息被保存在Annotation的"name=value"对中。在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/ArIdroid中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。未来的开发模式都是基于注解的,JPA(java的持久化API)是基于注解的,Spring2.5以. E都是基于注解的,Hibernate3.x以后也是基于注解的,现在的Struts2有一部分也是基于注解的了,注解是一种趋势,一定程度上可以说 :框架=注解+反射+设计模式。

 

注解的使用实例

 

Junit的注解

@Test

@Before

@After

 

代码:

 1 package com.llh;
 2 
 3 import com.llh.calculator.Calculator;
 4 import org.junit.After;
 5 import org.junit.Assert;
 6 import org.junit.Before;
 7 import org.junit.Test;
 8 
 9 public class CalculatorTest {
10     @Before
11     public void init(){
12         System.out.println("方法执行开始了。。。");
13     }
14     @After
15     public void close(){
16         System.out.println("方法执行结束了。。。");
17     }
18     @Test
19     public void testAdd(){
20         System.out.println("测试add方法");
21         Calculator cal = new Calculator();
22         int result = cal.add(10, 30);
23         Assert.assertEquals(40,result);//第一个参数:预测结果  第二个参数:实际结果
24     }
25 }

 

文档相关的注解

说明注释允许你在程序中嵌入关于程序的信息。你可以使用 javadoc 工具软件来生成信息,并输出到HTML文件中。

说明注释,使你更加方便的记录你的程序信息。

文档注解我们一般使用在文档注释中,配合javadoc工具

javadoc 工具软件识别以下标签:

  

其中注意:

Ø @param @return和@exception这三个标记都是只用于方法的。

Ø @param的格式要求: @param 形参名 形参类型 形参说明

Ø @return的格式要求: @return 返回值类型返回值说明,如果方法的返回值类型是void就不能写

Ø @exception的格式要求: @exception 异常类型异常说明

Ø @param和@exception可以并列多个

 

代码:

 1 public class Person {
 2     /**
 3      * 下面是eat方法,实现了XXX功能。
 4      * @param num1 就餐人数
 5      * @param num2 点了几个菜
 6      */
 7     public void eat(int num1,int num2){
 8     }
 9     /**
10      * @param age 年龄
11      * @return int
12      * @exception RuntimeException 当年龄过大的时候
13      * @exception IndexOutOfBoundsException 当年龄过小的时候
14      * @see Student
15      */
16     public int sleep(int age){
17         new Student();
18         if(age>100){
19             throw new RuntimeException();
20         }
21         if(age<0){
22             throw new IndexOutOfBoundsException();
23         }
24         return 10;
25     }
26 }

 

IDEA中的javadoc使用:

 

防止乱码:

 

 

JDK内置的3个注解

@Override:限定重写父类方法,该注解只能用于方法

1 public class Person {
2     public void eat(){
3         System.out.println("父类eat..");
4     }
5 }
1 public class Student extends Person {
2     /*
3     @Override的作用:限定重写的方法,只要重写方法有问题,就有错误提示。
4      */
5     @Override
6     public void eat(){
7         System.out.println("子类eat..");
8     }
9 }

 

@Deprecated:用于表示所修饰的元素(类,方法,构造器,属性等)已过时。通常是因为所修饰的结构危险或存在更好的选择

 1 public class Student extends Person {
 2     /*
 3     @Override的作用:限定重写的方法,只要重写方法有问题,就有错误提示。
 4      */
 5     @Override
 6     public void eat(){
 7         System.out.println("子类eat..");
 8     }
 9     /*
10     在方法前加入@Deprecated,这个方法就会变成一个废弃方法/过期方法/过时方法
11      */
12     @Deprecated
13     public void study(){
14         System.out.println("学习。。");
15     }
16 }
 

@SuppressWarnings:抑制编译器警告

 1 public class Test02 {
 2     //这是一个main方法,是程序的入口:
 3     public static void main(String[] args) {
 4         @SuppressWarnings("unused")
 5         int age = 10;
 6         
 7         int num = 10;
 8         System.out.println(num);
 9         @SuppressWarnings({"unused","rwatypes"})
10         ArrayList al = new ArrayList();
11     }
12 }

 

实现替代配置文件功能的注解

在servlet3.0之前的配置:

 1 package com.llh;
 2 
 3 import javax.servlet.*;
 4 import java.io.IOException;
 5 
 6 public class HelloServlet implements Servlet {
 7     @Override
 8     public void init(ServletConfig servletConfig) throws ServletException {
 9 
10     }
11 
12     @Override
13     public ServletConfig getServletConfig() {
14         return null;
15     }
16 
17 
18     @Override
19     public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
20         System.out.println("service方法被调用了...");
21     }
22 
23     @Override
24     public String getServletInfo() {
25         return null;
26     }
27 
28     @Override
29     public void destroy() {
30 
31     }
32 }

 

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"

         version="4.0">

    <!--配置Servlet-->

    <!--配置Servlet的信息-->

    <servlet>

        <servlet-name>HelloServlet</servlet-name>

        <servlet-class>com.bjsxt.servlet.HelloServlet</servlet-class>

    </servlet>

    <!--配置Servlet的映射路径-->

    <servlet-mapping>

        <servlet-name>HelloServlet</servlet-name>

        <!--http://localhost:8080/01-hello-servlet/hello-->

        <url-pattern>/hello</url-pattern>

    </servlet-mapping>

</web-app>

在servlet3.0之后使用注解:替代配置文件。

 

 1 package com.llh;
 2 
 3 package com.bjsxt.servlet;
 4 
 5 import javax.servlet.*;
 6 import java.io.IOException;
 7 
 8 @WebServlet("/hello")
 9 public class HelloServlet implements Servlet {
10     @Override
11     public void init(ServletConfig servletConfig) throws ServletException {
12 
13     }
14 
15     @Override
16     public ServletConfig getServletConfig() {
17         return null;
18     }
19 
20     /**
21      * 用于提供服务, 接收请求, 处理响应
22      *
23      * @param servletRequest
24      * @param servletResponse
25      * @throws ServletException
26      * @throws IOException
27      */
28     @Override
29     public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
30         System.out.println("service方法被调用了...");
31     }
32 
33     @Override
34     public String getServletInfo() {
35         return null;
36     }
37 
38     @Override
39     public void destroy() {
40 
41     }
42 }

 

自定义注解

【1】自定义注解使用很少,一般情况下都是用现成的注解。

【2】如何自定义注解:

 

 

发现定义的注解的声明使用的关键字:@interface,跟接口没有一点关系。

【3】注解的内部:

@SuppressWarnings为例,发现内部:

  

这value是属性还是方法?

答案:看上去是无参数方法,实际上理解为一个成员变量,一个属性

无参数方法名字--》成员变量的名字

无参数方法的返回值--》成员变量的类型

这个参数叫 配置参数

 

无参数方法的类型:基本数据类型(八种),String,枚举,注解类型,还可以是以上类型对应的数组。

 

PS:注意:如果只有一个成员变量的话,名字尽量叫value。

【4】使用注解:

(1)使用注解的话,如果你定义了配置参数,就必须给配置参数进行赋值操作:

1 @MyAnnotation(value={"abc","def","hij"})
2 public class Person {
3 }

 

(2)如果只有一个参数,并且这个参数的名字为value的话,那么value=可以省略不写。

1 @MyAnnotation({"abc","def","hij"})
2 public class Person {
3 }

 

(3)如果你给配置参数设置默认的值了,那么使用的时候可以无需传值:

1 public @interface MyAnnotation2 {
2     String value() default "abc";
3 }

 

使用:

1 @MyAnnotation2
2 @MyAnnotation({"abc","def","hij"})
3 public class Person {
4 }

 

(4)一个注解的内部是可以不定义配置参数的:

1 public @interface MyAnnotation3 {
2 }

内部没有定义配置参数的注解--》可以叫做标记

 

内部定义配置参数的注解--》元数据

  

【5】注解的使用:

 

现在只学习注解的大致技能点,具体怎么应用  后面慢慢学习。

 

元注解

元注解是用于修饰其它注解的注解。 

举例:

  

JDK5.0提供了四种元注解:Retention, Target, Documented, Inherited

 

Retention

@Retention:用于修饰注解,用于指定修饰的那个注解的生命周期,@Rentention包含一个RetentionPolicy枚举类型的成员变量,使用@Rentention时必须为该value成员变量指定值:

➢RetentionPolicy.SOURCE:在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注释,在.class文件中不会保留注解信息

案例:

 

 

反编译查看字节码文件:发现字节码文件中没有MyAnnotation这个注解:

 

➢RetentionPolicy.CLASS:在class文件中有效(即class保留),保留在.class文件中,但是当运行Java程序时,他就不会继续加载了,不会保留在内存中,JVM不会保留注解。如果注解没有加Retention元注解,那么相当于默认的注解就是这种状态。

案例:

 

 

反编译看字节码文件,字节码文件中带有MyAnnotation注解:

 

➢RetentionPolicy.RUNTIME:在运行时有效(即运行时保留),当运行 Java程序时,JVM会保留注释,加载在内存中了,那么程序可以通过反射获取该注释。

Target

用于修饰注解的注解,用于指定被修饰的注解能用于修饰哪些程序元素。@Target也包含一个名为value的成员变量。

案例:

1 @Target({TYPE,CONSTRUCTOR,METHOD})
2 public @interface MyAnnotation4 {
3 }

 

使用:

  

Documented(很少)

用于指定被该元注解修饰的注解类将被javadoc工具提取成文档。默认情况下,javadoc是 不包括注解的,但是加上了这个注解生成的文档中就会带着注解了

案例:

如果:Documented注解修饰了Deprecated注解,

 

那么Deprecated注解就会在javadoc提取的时候,提取到API中:

  

Inherited(极少)

被它修饰的Annotation将具有继承性。如果某个类使用了被

@Inherited修饰的Annotation,则其子类将自动具有该注解。

 

案例:

注解:如果MyAnno注解使用了@Inherited之后,就具备了继承性,那么相当于子类Student也使用了这个MyAnno

 

父类:

子类:

  

枚举

 

引入

【1】数学:枚举法:

1<x<4

2<y<5

求x+y=6

枚举法:一枚一枚的列举出来。前提:有限,确定

 

【2】在java中,类的对象是有限个,确定的。这个类我们可以定义为枚举类。

举例:

星期:一二三四五六日  

性别:男女

季节:春夏秋冬

 

【3】自定义枚举类:(JDK1.5之前自定义枚举类)

 1 package com.llh;
 2 
 3 public class Season {
 4     //属性:
 5     private final String seasonName ;//季节名字
 6     private final String seasonDesc ;//季节描述
 7     //利用构造器对属性进行赋值操作:
 8     //构造器私有化,外界不能调用这个构造器,只能Season内部自己调用
 9     private Season(String seasonName,String seasonDesc){
10         this.seasonName = seasonName;
11         this.seasonDesc = seasonDesc;
12     }
13     //提供枚举类的有限的  确定的对象:
14     public static final Season SPRING = new Season("春天","春暖花开");
15     public static final Season SUMMER = new Season("夏天","烈日炎炎");
16     public static final Season AUTUMN = new Season("秋天","硕果累累");
17     public static final Season WINTER = new Season("冬天","冰天雪地");
18     //额外因素:
19     public String getSeasonName() {
20         return seasonName;
21     }
22     public String getSeasonDesc() {
23         return seasonDesc;
24     }
25     //toString();
26     @Override
27     public String toString() {
28         return "Season{" +
29                 "seasonName='" + seasonName + '\'' +
30                 ", seasonDesc='" + seasonDesc + '\'' +
31                 '}';
32     }
33 }

 

测试类:

1 public class TestSeason {
2     //这是一个main方法,是程序的入口:
3     public static void main(String[] args) {
4         Season summer = Season.SUMMER;
5         System.out.println(summer/*.toString()*/);
6         System.out.println(summer.getSeasonName());
7     }
8 }

 

JDK1_5之后使用enum关键字来创建枚举类

JDK1.5以后使用enum关键字创建枚举类:

 

变为下面的枚举类:

 1 package com.llh;
 2 
 3 /**
 4  * @author : llh
 5  * 定义枚举类:季节
 6  */
 7 public enum Season {
 8     //提供枚举类的有限的  确定的对象:--->enum枚举类要求对象(常量)必须放在最开始位置
 9     //多个对象之间用,进行连接,最后一个对象后面用;结束
10     SPRING("春天","春暖花开"),
11     SUMMER("夏天","烈日炎炎"),
12     AUTUMN("秋天","硕果累累"),
13     WINTER("冬天","冰天雪地");
14     //属性:
15     private final String seasonName ;//季节名字
16     private final String seasonDesc ;//季节描述
17     //利用构造器对属性进行赋值操作:
18     //构造器私有化,外界不能调用这个构造器,只能Season内部自己调用
19     private Season(String seasonName, String seasonDesc){
20         this.seasonName = seasonName;
21         this.seasonDesc = seasonDesc;
22     }
23     //额外因素:
24     public String getSeasonName() {
25         return seasonName;
26     }
27     public String getSeasonDesc() {
28         return seasonDesc;
29     }
30     //toString();
31     @Override
32     public String toString() {
33         return "Season{" +
34                 "seasonName='" + seasonName + '\'' +
35                 ", seasonDesc='" + seasonDesc + '\'' +
36                 '}';
37     }
38 }

 

使用枚举类:

 1 public class TestSeason {
 2     //这是一个main方法,是程序的入口:
 3     public static void main(String[] args) {
 4         Season winter = Season.WINTER;
 5         System.out.println(winter);
 6         //enum关键字对应的枚举类的上层父类是 :java.lang.Enum
 7         //但是我们自定义的枚举类的上层父类:Object
 8         System.out.println(Season.class.getSuperclass().getName());//java.lang.Enum
 9     }
10 }

 

在源码中经常看到别人定义的枚举类形态:

1 public enum Season {
2     SPRING,
3     SUMMER,
4     AUTUMN,
5     WINTER;
6 }

 

为什么这么简单:因为这个枚举类底层没有属性,属性,构造器,toString,get方法都删掉不写了,然后案例来说应该

写为:SPRING()   现在连()可以省略 就变成  SPRING

看到的形态就剩:常量名(对象名)

 

案例:

Thread中的枚举类:State

 1 public enum State {
 2         /**
 3          * Thread state for a thread which has not yet started.
 4          */
 5         NEW,
 6         /**
 7          * Thread state for a runnable thread.  A thread in the runnable
 8          * state is executing in the Java virtual machine but it may
 9          * be waiting for other resources from the operating system
10          * such as processor.
11          */
12         RUNNABLE,
13         /**
14          * Thread state for a thread blocked waiting for a monitor lock.
15          * A thread in the blocked state is waiting for a monitor lock
16          * to enter a synchronized block/method or
17          * reenter a synchronized block/method after calling
18          * {@link Object#wait() Object.wait}.
19          */
20         BLOCKED,
21         /**
22          * Thread state for a waiting thread.
23          * A thread is in the waiting state due to calling one of the
24          * following methods:
25          * <ul>
26          *   <li>{@link Object#wait() Object.wait} with no timeout</li>
27          *   <li>{@link #join() Thread.join} with no timeout</li>
28          *   <li>{@link LockSupport#park() LockSupport.park}</li>
29          * </ul>
30          *
31          * <p>A thread in the waiting state is waiting for another thread to
32          * perform a particular action.
33          *
34          * For example, a thread that has called <tt>Object.wait()</tt>
35          * on an object is waiting for another thread to call
36          * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
37          * that object. A thread that has called <tt>Thread.join()</tt>
38          * is waiting for a specified thread to terminate.
39          */
40         WAITING,
41         /**
42          * Thread state for a waiting thread with a specified waiting time.
43          * A thread is in the timed waiting state due to calling one of
44          * the following methods with a specified positive waiting time:
45          * <ul>
46          *   <li>{@link #sleep Thread.sleep}</li>
47          *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
48          *   <li>{@link #join(long) Thread.join} with timeout</li>
49          *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
50          *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
51          * </ul>
52          */
53         TIMED_WAITING,
54         /**
55          * Thread state for a terminated thread.
56          * The thread has completed execution.
57          */
58         TERMINATED;
59     }

 

Enum类的常用方法

 1 package com.llh;
 2 
 3 /**
 4  * @author : llh
 5  */
 6 
 7 public class TestSeason {
 8     //这是一个main方法,是程序的入口:
 9     public static void main(String[] args) {
10         //用enum关键字创建的Season枚举类上面的父类是:java.lang.Enum,常用方法子类Season可以直接拿过来使用:
11         //toString();--->获取对象的名字
12         Season autumn = Season.AUTUMN;
13         System.out.println(autumn/*.toString()*/);//AUTUMN
14         System.out.println("--------------------");
15         //values:返回枚举类对象的数组
16         Season[] values = Season.values();
17         for(Season s:values){
18             System.out.println(s/*.toString()*/);
19         }
20         System.out.println("--------------------");
21         //valueOf:通过对象名字获取这个枚举对象
22         //注意:对象的名字必须传正确,否则抛出异常
23         Season autumn1 = Season.valueOf("AUTUMN");
24         System.out.println(autumn1);
25     }
26 }

 

枚举类实现接口

定义一个接口:

1 public interface TestInterface {
2     void show();
3 }

枚举类实现接口,并且重写show方法:

 1 public enum Season implements TestInterface {
 2     SPRING,
 3     SUMMER,
 4     AUTUMN,
 5     WINTER;
 6     @Override
 7     public void show() {
 8         System.out.println("这是Season....");
 9     }
10 }

 

测试类:

1 public class Test {
2     //这是一个main方法,是程序的入口:
3     public static void main(String[] args) {
4         Season autumn = Season.AUTUMN;
5         autumn.show();
6         Season summer = Season.SUMMER;
7         summer.show();
8     }
9 }

 

上面发现所有的枚举对象,调用这个show方法的时候走的都是同一个方法,结果都一样:

 

但是现在我想要:不同的对象  调用的show方法也不同:

 1 package com.llh;
 2 
 3 import java.sql.SQLOutput;
 4 
 5 public enum Season implements TestInterface {
 6     SPRING{
 7         @Override
 8         public void show() {
 9             System.out.println("这是春天。。。");
10         }
11     },
12     SUMMER{
13         @Override
14         public void show() {
15             System.out.println("这是夏天。。");
16         }
17     },
18     AUTUMN{
19         @Override
20         public void show() {
21             System.out.println("这是秋天");
22         }
23     },
24     WINTER{
25         @Override
26         public void show() {
27             System.out.println("这是冬天");
28         }
29     };
30     /*@Override
31     public void show() {
32         System.out.println("这是Season....");
33     }*/
34 }

测试类:

1 public class Test {
2     //这是一个main方法,是程序的入口:
3     public static void main(String[] args) {
4         Season autumn = Season.AUTUMN;
5         autumn.show();
6         Season summer = Season.SUMMER;
7         summer.show();
8     }
9 }


实际应用

 1 package com.llh;
 2 
 3 /**
 4  * @author : llh
 5  */
 6 
 7 public class Person {
 8     //属性:
 9     private int age;
10     private String name;
11     private Gender sex;
12     public int getAge() {
13         return age;
14     }
15     public void setAge(int age) {
16         this.age = age;
17     }
18     public String getName() {
19         return name;
20     }
21     public void setName(String name) {
22         this.name = name;
23     }
24     public Gender getSex() {
25         return sex;
26     }
27     public void setSex(Gender sex) {
28         this.sex = sex;
29     }
30     @Override
31     public String toString() {
32         return "Person{" +
33                 "age=" + age +
34                 ", name='" + name + '\'' +
35                 ", sex='" + sex + '\'' +
36                 '}';
37     }
38 }
1 public enum Gender {
2     男,
3     女;
4 }
 1 public class Test {
 2     //这是一个main方法,是程序的入口:
 3     public static void main(String[] args) {
 4         Person p = new Person();
 5         p.setAge(19);
 6         p.setName("lili");
 7         p.setSex(Gender.男);//传入枚举类Gender的对象:-->在入口处对参数进行了限制
 8         System.out.println(p);
 9     }
10 }
 

还可以通过枚举结合switch处理:

 1 public class Test02 {
 2     //这是一个main方法,是程序的入口:
 3     public static void main(String[] args) {
 4         Gender sex = Gender.男;
 5         //switch后面的()中可以传入枚举类型
 6         //switch后面的():int,short,byte,char,String ,枚举
 7         switch (sex){
 8             case 女:
 9                 System.out.println("是个女孩");
10                 break;
11             case 男:
12                 System.out.println("是个男孩");
13                 break;
14         }
15     }
16 }