Java学习day33-枚举类和注解

一、枚举类概述

1.在某些情况下,一个类的对象是有限而且固定的。例如季节类,只能有春夏秋冬四个对象。

2.手动实现枚举类:

  ①private修饰构造器

  ②属性使用private final修饰

  ③把该类的所有实例都使用public static final来修饰

 

二、使用enum定义枚举类

1.JDK1.5新增的enum关键字用于定义枚举类。

2.枚举类和普通类的区别:

  ①使用enum定义的枚举类默认继承了 java.lang.Enum类。

  ②枚举类的构造器只能使用private访问控制符。

  ③枚举类的所有实例必须在枚举类中显式列出(,分隔 ;结尾).列出的实例系统会自动添加public static final 修饰。

  ④所有的枚举类都提供了一个values方法,该方法可以很方便的遍历所有的枚举类。

3.JDK1.5中可以在switch表达式中使用枚举类的对象作为表达式,case子句可以直接使用枚举值的名字,无需添加枚举类作为限定。

4.若枚举只有一个成员,则可以作为一种单例模式的实现方式。

 

三、实现接口的枚举类

1.和普通java类一样枚举类可以实现一个或多个接口。

2.若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式,则可以让每个枚举值分别来实现该方法。

package day13;

public class Test3 {
    public static void main(String[] args){
        //Season.SPRING,这段执行就是获取一个Season的对象
        Season spring = Season.SPRING;
        spring.showInfo();
        
        Season summer = Season.SUMMER;
        summer.showInfo();
        
        Season autumn = Season.AUTUMN;
        autumn.showInfo();
        
        Season winter = Season.WINTER;
        winter.showInfo();
        
        Season spring1 = Season.SPRING;//每次执行Season.SPRING获得的是相同的对象,说明枚举类中的每个枚举都是单例模式
        System.out.println(spring.equals(spring1));
        
        spring1.test();
    }
}

enum Season implements ITest{
    SPRING("春天","春暖花开"),//此处相当于在调用有参的私有构造private Season(String name,String desc)
    SUMMER("夏天","炎炎夏日"),
    AUTUMN("秋天","秋高气爽"),
    WINTER("冬天","寒风刺骨");
    
    private final String name;
    private final String desc;
    
    private Season(String name,String desc){
        this.name = name;
        this.desc = desc;
    }
    
    public void showInfo(){
        System.out.println(this.name + ":" + this.desc);
    }

    public void test() {
        // TODO Auto-generated method stub
        System.out.println("这是实现的ITest接口的test方法");
    }
    
}

interface ITest{
    void test();
}

打印结果为:

Java学习day33-枚举类和注解

 

四、Annotation(注释)概述

1.从JDK5.0开始,Java增加了对元数据(MetaData)的支持,也就是Annotation(注释)。

2.Annotation其实就是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。

3.Annotation可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被保存在Annotation的“name = value”对中。

4.Annotation能被用来为程序元素(类、方法、成员变量等)设置元数据。

 

五、基本的Annotation

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

2.三个基本的Annotation

  ①@oOverride:限定重写父类方法,该注释只能用于方法。

  ②@Deprecated:用于表示某个程序元素(类、方法等)已过时。

  ③@SuppressWarnings:抑制编译器警告。

 

六、自定义Annotation

1.定义新的Annotation类型使用@interface关键字。

2.Annotation的成员变量在Annotation定义中以无参数方法的形式来声明,其方法名和返回值定义了该成员的名字和类型。

3.可以在定义Annotation的成员变量时为其指定初始值,指定成员变量的初始值可以使用default关键字。

4.没有成员定义的Annotation称为标记;包含成员变量的Annotation称为元数据Annotation。

package day13;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.List;

public class Test4 {
    public static void main(String[] args){
    new TestB().test1();
    
    @SuppressWarnings({ "rawtypes", "unused" })
    List list = new ArrayList();
    }
}

class TestA{
    public void test(){
        
    }
}

class TestB extends TestA{
    @TestAnn(id = 100,desc = "姓名")
    String name;
    
    @Override
    public void test() {
        // TODO Auto-generated method stub
        super.test();
    }
    
    @Deprecated
    public void test1(){
        
    }
}


@Target(ElementType.FIELD)//这个注解类是给其它类的属性做注解
@Retention(RetentionPolicy.RUNTIME)//定义注解的生命周期
@Documented//注解放到doc文档中
@interface TestAnn{
    public int id() default 0;
    
    public String desc() default "";
}

注解暂时作为了解,普通开发用不到,做开源项目之类的可能会用到。

深入了解需要学习注解Annotation实现原理与自定义注释的一些例子。

 

上一篇:数据库课堂小结day33


下一篇:python基础一 day33 验证客户端的合法性