1.4(java高级特性)枚举类和注解

**前言:**兄弟们你的三连是对我最大的鼓励。下次一定嘿嘿

我会努力认真的完成后续的文章的,希望可以帮到需要的人。

我也是特别懒惰,动不动就刷短视频就是小半天,哎呀,要自觉自觉。

接下来的文章内容来源于

[硅谷学习路线](2021年度全网最全Java学习路线 - 哔哩哔哩 (bilibili.com))

2021年黑马程序员Java学习路线图 - 哔哩哔哩 (bilibili.com)

枚举类

当一个类,创建对象是固定个数的,我们可以称之为枚举类

比如所:

季节类:创建对象(春夏秋冬)

性别类:只能存在(男,女,雌雄双体,无性)哈哈

总的来说就是这个类的只能创建这几个对象,单例模式:还只能创建一个对象呢

当需要定义一组常量时候,强烈建议使用枚举类

如何定义枚举类

JDK5.0前:通过自己编写代码来实现

JDK5.0后:可以使用enum关键字定义枚举类

自定义枚举类

自定义一个季节类,只能创建春夏秋冬四个季节

//通过自定义代码创建一个季节枚举类
//该类只存在春夏秋冬四个对象表示不同的季节
public class Season {
    
    

    //    设置属性为私有的常量
// 不能直接进行调用属性且不能赋值
    private final String SEASONNAME;//季节的名称
    private final String SEASONDESC;//季节的描述

//    设置类属性的get方法可以用来输出属性值
    public String getSEASONNAME(){
    
    
        return SEASONNAME;
    }
    public String getSEASONDESC(){
    
    
        return SEASONDESC;
    }

//    设置私有的构造函数
// 不能再本类外通过构造函数创建对象了
    private Season(String seasonName, String seasonDesc) {
    
    
        this.SEASONNAME = seasonName;
        this.SEASONDESC = seasonDesc;
    }

//    设置共有的 静态的  常量的 属性这个属性表示的就是该类的对象
//    表示该类只能存在这四个对象(春夏秋冬)
    public static final Season SPRING = new Season("春天", "春暖花开");
    public static final Season SUMMER = new Season("夏天", "夏日炎炎");
    public static final Season AUTUMN = new Season("秋天", "秋高气爽");
    public static final Season WINTER = new Season("冬天", "白雪皑皑");

    @Override
    public String toString(){
    
    
        return "Season{季节名称:"+SEASONNAME+",季节描述:"+SEASONDESC+"}";
    }


}

调用做测试

public class SeasonTest {
    
    
    public static void main(String[] args) {
    
    

//        只能通过指定的静态属性获取对象
        Season spring = Season.SPRING;

        System.out.println(spring.toString());
    }
}

在这里插入图片描述

发现上面的代码:确实可以实现一个类创建固定个数的对象。

我们接下来使用enum关键进行编写枚举类

Enum关键字

使用 enum 定义的枚举类默认继承了 java.lang.Enum类,因此不能再 继承其他类 ,所以tostring的功能也是发生了改变

枚举类的构造器只能使用 private 权限修饰符

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

必须在枚举类的第一行声明枚举类对象

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

//使用enum关键字创建枚举类
public enum SeasonEnum {
    
    

//    首先是对象一定要声明在这里位置
//    并且省略很多部分 多个对象之间使用逗号隔开
    SPRING("春天","春暖花开"),
    SUMMER("夏天","夏日炎炎"),
    AUTUMN("秋天","秋高气爽"),
    WINTER("冬天","白雪皑皑");


    //    设置属性为私有的常量
// 不能直接进行调用属性且不能赋值
    private final String SEASONNAME;//季节的名称
    private final String SEASONDESC;//季节的描述

    //    设置类属性的get方法可以用来输出属性值
    public String getSEASONNAME() {
    
    
        return SEASONNAME;
    }

    public String getSEASONDESC() {
    
    
        return SEASONDESC;
    }

    //    设置私有的构造函数
// 不能再本类外通过构造函数创建对象了
    private SeasonEnum(String seasonName, String seasonDesc) {
    
    
        this.SEASONNAME = seasonName;
        this.SEASONDESC = seasonDesc;
    }


    @Override
    public String toString() {
    
    
        return "Season{季节名称:" + SEASONNAME + ",季节描述:" + SEASONDESC + "}";
    }

}

public class SeasonTest {
    
    
    public static void main(String[] args) {
    
    

//        只能通过指定的静态属性获取对象
        Season spring = Season.SPRING;
        System.out.println(spring.toString());

        
        SeasonEnum spring1 = SeasonEnum.SPRING;
        System.out.println(spring1);
    }
}

在这里插入图片描述

这里说明一下,使用enum关键字之后,该类就不是默认继承Object类了。

enum类的常见方法

方法 描述
values() 返回枚举类型的对象数组。该方法可以很方便地遍历所有的 枚举值。
valueOf(String str) 可以把一个字符串转为对应的枚举类对象。要求字符 串必须是枚举类对象的“名字”。如不是,会有运行时异常: IllegalArgumentException。
toString() 返回当前枚举类对象常量的名称

枚举类实现接口

和普通 Java 类一样,枚举类可以实现一个或多个接口

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

package Enum;

//使用enum关键字创建枚举类
public enum SeasonEnum implements HH {
    
    

    //    首先是对象一定要声明在这里位置
//    并且省略很多部分 多个对象之间使用逗号隔开

//    还可以在具体的对象,使用不同的操作
    SPRING("春天", "春暖花开") {
    
    
        public void show() {
    
    

        }
    },
    SUMMER("夏天", "夏日炎炎"){
    
    
        
    },
    AUTUMN("秋天", "秋高气爽"),
    WINTER("冬天", "白雪皑皑");

//    可以创建一个大家都使用的方法
    public void show() {
    
    

    }


    //    设置属性为私有的常量
// 不能直接进行调用属性且不能赋值
    private final String SEASONNAME;//季节的名称
    private final String SEASONDESC;//季节的描述

    //    设置类属性的get方法可以用来输出属性值
    public String getSEASONNAME() {
    
    
        return SEASONNAME;
    }

    public String getSEASONDESC() {
    
    
        return SEASONDESC;
    }

    //    设置私有的构造函数
// 不能再本类外通过构造函数创建对象了
    private SeasonEnum(String seasonName, String seasonDesc) {
    
    
        this.SEASONNAME = seasonName;
        this.SEASONDESC = seasonDesc;
    }


    @Override
    public String toString() {
    
    
        return "Season{季节名称:" + SEASONNAME + ",季节描述:" + SEASONDESC + "}";
    }


}

//创建一个接口,中存在一个展示方法
interface HH {
    
    
    void show();

}

这里再使用图片展示一下

在这里插入图片描述

注解(Annotation)

从 JDK 5.0 开始, Java 增加了对元数据(MetaData) 的支持, 也就是 Annotation(注解)

Annotation 其实就是代码里的特殊标记,

这些标记可以在编译, 类加 载, 运行时被读取, 并执行相应的处理。

通过使用 Annotation, 程序员 可以在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息。

代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证 或者进行部署。

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

未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以 上都是基于注解的,Hibernate3.x以后也是基于注解的,现在的 Struts2有一部分也是基于注解的了,注解是一种趋势,一定程度上 可以说:框架 = 注解 + 反射 + 设计模式。

注解的使用

注解:之后在学框架的时候就可以广泛的体验到注解带来的便捷了

JDK内置注解

@Override

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

就是说子类继承父类放在子类的重写方法上,不放也可以,放一些起到标识作用。

如果乱放,回报警告

@Deprecated

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

这个注解用于修饰已经过时。

public void show() {
    
    

        Date date = new Date();
//        看到这里的方法画了一个线,表示这个方法应经过时,建议不用但是可以使用
        date.getYear();

    }

Date源码

在这里插入图片描述

@SuppressWarnings

抑制编译器警告

比如说,我们再声明变量的时候,变量在没有使用的时候,会显示不同的颜色,如果想要使它没有这类效果就可以使用该注解

使用前

在这里插入图片描述

使用后

在这里插入图片描述

该注解常用参数

我是百度小能手,有问题问百度。实在不行就可以将问题放到CSDN上面就会有人帮你解答。最后在问周边人(哈哈加油吧)今天12点才起床开始写这篇博客

关键字 用途
all to suppress all warnings抑制所有警告
boxing to suppress warnings relative to boxing/unboxing operations抑制与 拆/装箱相关的警告
cast to suppress warnings relative to cast operations抑制与强制转换相关的警告
dep-ann to suppress warnings relative to deprecated annotation抑制与废弃注释相关的警告
deprecation to suppress warnings relative to deprecation抑制与弃用相关的警告
fallthrough to suppress warnings relative to missing breaks in switch statements抑制与switch语句中丢失的中断的相关的警告
finally to suppress warnings relative to finally block that don’t return抑制finally块中不返回警告
hiding to suppress warnings relative to locals that hide variable抑制相对于隐藏变量的局部变量的警告
incomplete-switch to suppress warnings relative to missing entries in a switch statement (enum case)抑制相对于switch语句中丢失的条目相关的警告(枚举情况)
nls to suppress warnings relative to non-nls string literals抑制与non-nls字符串相关的警告
null to suppress warnings relative to null analysis抑制解析为空相关的警告
rawtypes to suppress warnings relative to un-specific types when using generics on class params在类参数上使用泛型时,抑制与非特定类型相关的警告
restriction to suppress warnings relative to usage of discouraged or forbidden references抑制使用与禁止引用相关的警告
serial to suppress warnings relative to missing serialVersionUID field for a serializable class抑制与可序列化类缺少serialVersionUID字段相关的警告
static-access to suppress warnings relative to incorrect static access抑制与不正确的静态访问相关的警告
synthetic-access to suppress warnings relative to unoptimized access from inner classes抑制与内部类的未优化访问相关的警告
unchecked to suppress warnings relative to unchecked operations抑制与未检查操作相关的警告
unqualified-field-access to suppress warnings relative to field access unqualified抑制与字段访问无关的警告
unused to suppress warnings relative to unused code抑制与未使用代码相关的警告

自定义注解(Annotation)

这里的课程自定义注解名没有细讲,只是书明了,自定义注解的格式。

因为注解是要结合java反射一起使用的。

反射:可以在java程序执行中动态的改变代码,反射可以操作一个类,方法,属性的API。(这里之后会提到)

自定义注解格式

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

自定义注解自动继承了java.lang.annotation.Annotation接口

Annotation 的成员变量在 Annotation 定义中以无参数方法的形式来声明。其 方法名和返回值定义了该成员的名字和类型。我们称为配置参数。类型只能 是八种基本数据类型、String类型、Class类型、enum类型、Annotation类型、 以上所有类型的数组。

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

如果只有一个参数成员,建议使用参数名为value

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

示例:标记注解

//我的第一个注解
//通过@interface 声明了一个注解
//没有一个放入 定义成员属性 就是标记注解
public @interface MyOneAnnotation {
    
    


}

//测试我的注解
//现在这个注解并没有作用,作用是需要结合反射进行编写的。
@MyOneAnnotation
public class AnnotationTest {
    
    

}

示例 指定值注解

//我的第一个注解
//通过@interface 声明了一个注解
//没有一个放入 定义成员属性 就是标记注解
public @interface MyOneAnnotation {
    
    

//    设置一个带有默认值的value
    String value() default  "默认值";
    
}

//测试我的注解
//现在这个注解并没有作用,作用是需要结合反射进行编写的。

//表示使用了默认值
@MyOneAnnotation()
public class AnnotationTest {
    
    
    public static void main(String[] args) {
    
    

//    这个value可以不写,不写默认也是指定value
        @MyOneAnnotation(value = "hhh")
        String str;
        
    }
}

对于注解的详细使用,我会在反射中继续编写

JDK元注解

JDK5.0提供了4个标准的meta-annotation类型,分别是:

  1. Retention
  2. Target
  3. Documented
  4. Inherited

所谓的元注解就是用来修饰 其他的注解(Annotation)注解

在这里插入图片描述

这是@SuppressWarning注解,发现上面还存在一些注解,用于修饰它的注解

Retention

只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 的生命 周期, @Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用 @Rentention 时必须为该 value 成员变量指定值:

RetentionPolicy枚举类

该枚举类存在哪些对象呢

枚举对象 描述
RetentionPolicy.SOURCE 在源文件中有效(即源文件保留),编译器直接丢弃这种策略的 注释
RetentionPolicy.CLASS 在class文件中有效(即class保留) , 当运行 Java 程序时, JVM 不会保留注解。 这是默认值
RetentionPolicy.RUNTIME 在运行时有效(即运行时保留),当运行 Java 程序时, JVM 会 保留注释。程序可以通过反射获取该注释。

在这里插入图片描述

具体使用可以参考上面的suppresswarning

Target

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

这个元注解来指定修饰的注解,可以被用于是类上,属性上,方法上的等

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    
    
    /**
     * Returns an array of the kinds of elements an annotation type
     * can be applied to.
     * @return an array of the kinds of elements an annotation type
     * can be applied to
     */
    ElementType[] value();
}

注解源码,值是一个ElementType[]数组

取值 注解使用范围
METHOD 可用于方法上
TYPE 可用于类或者接口上
ANNOTATION_TYPE 可用于注解类型上(被@interface修饰的类型)
CONSTRUCTOR 可用于构造方法上
FIELD 可用于域上
LOCAL_VARIABLE 可用于局部变量上
PACKAGE 用于记录java文件的package信息
PARAMETER 可用于参数上

Documented

用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档。

默认情况下,javadoc是不包括注解的。

定义为Documented的注解必须设置Retention值为RUNTIME。

@Inherited

被它修饰的 Annotation 将具有继承性。

如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解。

比如:如果把标有@Inherited注解的自定义的注解标注在类级别上,子类则可以 继承父类类级别的注解

实际应用中,使用较少

父类使用的注解被它修饰,子类也会存在父类的注解

注解多用

我们在使用注解的时候发现一个注解修饰类或属性等的时候

只能使用一次,如果想要使用多次呢

在这里插入图片描述

JDK8前

使用另一个注解讲需要多次添加的注解设置为数组,添加

在这里插入图片描述

在这里插入图片描述

JDK8之后

@Repeatable(需要多此注解类放入即可)

おすすめ

転載: blog.csdn.net/weixin_46401545/article/details/121491275