24-07-24 java枚举与注解详解

24-07-24 java枚举与注解详解

初步认识枚举类

​ 在我们以前OOP的学习中,我们熟练的掌握了一些类与对象之间的相关知识,并且能够灵活的创建各种各样的对象,但是我们似乎忽略了一个问题,无论是从生活常识还是命名规范上来讲,有些类的对象不能够随便创建,甚至个数都有严格要求,例如season季节类只能有4个对象,春夏秋冬,所以我们需要一种类来帮助我们更好地枚举出这些对象,这这种类就叫做枚举类(enumeration)。

枚举类的定义-自定义枚举类

枚举类是一种特殊的类,它是一组常量的集合,为什么这么说呢,因为枚举类包含的是一组有限的对象,简单来说就是直接在类中定义对象,而不通过构造函数,所以我们需要把构造函数给私有化,而为了防止对象的属性被篡改,保证对象的只读属性,我们需要同样需要删除或者私有化set方法,最后,为了底层实现更加快捷高效,我们在对象前面加上static final,我们要让对象作为枚举类的接口,因此需要把对象公开,前面需要加上public。

​ 还有需要注意的是,因为这个对象是只读的,所以它是一个常量,根据命名规范,名称全部大写。

public class Enumeration {
    public static void main(String[] args) {
        Season.SPRING.say();
    }
}
class Season {
    public String season;
    public String des;
    private Season(String season, String des) {
        this.season = season;
        this.des = des;
    }
    public void say() {
        System.out.println(season+des);
    }
    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("冬天","寒冷");

}

枚举类的定义-使用enum关键字

​ 我们可以使用enum关键字来创建枚举类,如下把原先的class换成enum,创建对象方面采用常量名(参数列表)的方式实现,注意需要写在构造函数与定义变量前面(一般放在开头),如果要定义多个常量对象,不能另起一行,要用逗号分隔开,构造函数可以省略访问修饰符,因为enum类中默认private。我们重载toSTring方法来更好的输出。

public class Enumeration {
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
    }
}

enum Season {
    SPRING("春天","温暖"),SUMMER("夏天","炎热")
    ,AUTUMN("秋天","凉爽"),WINTER("冬天","寒冷");

    public final String season;
    public final String des;
    Season(String season,String des) {
        this.season = season;
        this.des = des;
    }

    @Override
    public String toString() {
        return "Season{" +
                "season='" + season + '\'' +
                ", des='" + des + '\'' +
                '}';
    }
}

enum关键字实现枚举的注意事项

​ 其实当我们使用enum关键字实现一个枚举类时候,默认会继承Enum类,构造函数默认private,成员变量默认final,这一切该如何证明呢。

​ 我们都知道,java文件通过javac命令编译为class文件才能运行,反过来,class文件也可以反编译为java文件。

image-20240724151253029

我们打开对应类class文件目录输入cmd进入控制台img

输入javap Season.class命令,如下图

image-20240724151421668

我们可以看到这个枚举类的真面目,它是继承自java.lang.Enum的,而且它的常量对象全是public static final修饰。

从传统的public static final Season SPRING = new Season(“春天”,“温暖”);到SPRING(“春天”,“温暖”);代码量大大简化,顺道一说,如果调用的构造函数是无参的话,常量对象后面的小括号设置都可以不用写。

SPRING1,SUMMER,AUTUMN,WINTER;
    public  String season;
    public  String des;
    Season() {
        
    }

枚举对象一定要放在行首。

enum常用方法

刚刚我们说了,使用enum关键字时候会隐式地继承Enum类,使用我们也可以在enum类中使用Enum中的相关方法。

image-20240724154618555

调用方法如下:

image-20240724162102070

结果如下:

image-20240724162156643

如果有不清楚的我们也可以按下ctrl+B查看函数源码。

enum实现接口

  1. 使用enum关键字以后,就不能再继承其他类了,因为enum会隐式的继承Enum,而java是单继承机制。

    image-20240724164249535

  2. 与普通类一样,枚举类也可以实现接口。

interface IT {
    void say();
}

enum ITT implements IT {
    III;

    @Override
    public void say() {
        System.out.println("我要学好java");
    }
}

认识注解

注解(Annotation)也被我们称为元数据,用于修饰包,类,方法。属性,构造器,局部变量等数据信息。与注释不同的是,注释不会被编译器编译,但是注解会被编译器编译。

一般来说,我以下三种注解最为常用:

  • @override
  • @deprecated
  • s

@override

class father {
    public void say() {
        
    }
}
class son extends father {
    @Override
    public void say() {
        super.say();
    }
}

可能有人会奇怪,就算不写@override应该也没问题呀,没错,但是这是在你继承成功的情况下,也就是你写对的情况下,如果我们的继承方法是像下面这样的

class son extends father {
    
    public void sa() {
        super.say();
    }
}

哈哈,编译器也不会报错,但是我们没有成功继承say方法,所以呢,@override是为了帮我们检查是否继承成功,如果我们这个时候加了@override。

image-20240724171010974

编译器可以立刻提示我们写错了,从而预防错误的发生。

还有需要注意的是,@override只能修饰方法,如果我们在@override初按下ctrl+B,我们可以看到@override的实现原理。

image-20240724171305916

其中,@interface表示一个注解类而不是一个接口,@Targe是修饰注解的注解,称为元注解。

@Deprecated

@Deprecated用于表示某个程序已经过时,不推荐使用,但是不推荐不代表不能用,如果我们调用了一个过时的方法,编译器会提示我们不推荐使用,但是可能还是可以运行的。

image-20240724172521259

如果我们进入@Deprecated的源码。

image-20240724172648164

我们可以知道@Deprected的使用地方包括方法,类,字段,包,参数等。

@SuppressWarnings

在我们编写代码的过程中,我们时不时会遇到警告信息。

image-20240724174336931

那么我们如何忽略这些警告呢,我们可以使用@SuppressWarnings。

image-20240724174635544

对应不同类型的警告,我们可以使用不同的@SuppressWarnings来忽略它们,也可以直接使用all忽视所有警告。

image-20240724174924585

image-20240724175101209

此外,@SuppressWarnings也有很大讲究,如果我们把它放在类前,就可以全局作用,当然也可以在特定的方法前消除警告。

image-20240724175351512

进入@SuppressWarnings源码

image-20240724175438075

链图片转存中…(img-LGv3vuU5-1721916341888)]

此外,@SuppressWarnings也有很大讲究,如果我们把它放在类前,就可以全局作用,当然也可以在特定的方法前消除警告。

[外链图片转存中…(img-4nftfaEX-1721916341889)]

进入@SuppressWarnings源码

[外链图片转存中…(img-tUdTTnwO-1721916341889)]

我们可以看到@SuppressWarnings的作用域为TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE。

讲解完毕,欢迎补充

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值