Java笔记之枚举和注解(十五)

一、枚举

1.基本介绍

枚举(enum):枚举是一组常量的集合,枚举属于一种特殊的类,里面只包含一组有限的特定的对象

2.实现方式

自定义类实现枚举

使用步骤

  1. 第一步:构造器私有化,防止直接new
  2. 第二步:不能有set方法,防止修改(只读)
  3. 第三部:在类的内部直接创建固定的对象

注意事项

  • 对枚举对象/属性使用final+static共同修饰,实现底层优化(对外暴露对象)
  • 枚举对象名通常使用全部大写
  • 枚举对象根据需求也可以有多个属性

快速入门

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

class Season{
    private String name;
    private String desc;

    //创建固定的对象,static暴露对象
    public final static Season SPRING = new Season("春天","温暖");
    public final static Season WINTER = new Season("冬天","寒冷");
    public final static Season AUTUMN = new Season("秋天","凉爽");
    public final static Season SUMMER = new Season("夏天","炎热");

    //构造器私有化
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

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

enum关键字实现枚举

注意:枚举属于一种特殊的类

使用步骤

  1. 第一步:把class关键字换成enum关键字
  2. 第二步:构造器私有化,且不能有set方法
  3. 第三步:创建枚举对象,直接 对象名(实参列表),如果有多个,写在一行中间用逗号隔开
  4. 第四步:将枚举对象放在首行

注意事项

  1. 当我们使用enum关键字开发一个枚举类时,默认会继承Enum类,而且是一个final类
  2. 在创建枚举对象时,必须知道它调用的是那个构造器
  3. 如果使用无参构造器创建枚举对象,则可以省略括号
  4. 当有多个枚举对象时,中间使用逗号隔开
  5. 枚举对象必须方法枚举类的首行
  6. 使用 enum 关键字后,就不能再继承其它类了,因为 enum 会隐式继承 Enum,而 Java 是单继承机制
  7. 枚举类和普通类一样,可以实现接口 如:enum 类名 implements 接口 1,接口 2{}
public class test1 {
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
        System.out.println(Season.WINTER);
        System.out.println(Season.AUTUMN);
        System.out.println(Season.SUMMER);
    }
}
interface A{}
interface B{}

enum Season implements A,B{
    //枚举对象对象,中间用逗号间隔,且必须放在枚举类首行
    SPRING("春天","温暖"),WINTER("冬天","寒冷"),
    AUTUMN("秋天","凉爽"),SUMMER("夏天","炎热"),WCGZ;//最后是一个无参构造器

    private String name;
    private String desc;

    //无参构造器
    private Season(){
        System.out.println("无参构造方法!");
    }

    //构造器私有化
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

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

思考:判断下面代码是否正确

enum Person{
	RUN,SPEAK;
}

解析:
1.Person是一个枚举类,它没有属性
2.有两个枚举类对象RUN和SPEAK,都调用了无参构造器

3.enum的成员方法

使用关键字enum时,会隐式继承Enum类,这样我们就可以使用Enum类相关的方法

方法名功能描述
toString子类可以重写该方法,用于返回对象的属性信息
name返回当前对象名(常量名),子类中不能重写
ordinal返回当前对象的位置号,默认从 0 开始
values返回当前枚举类中所有的常量
valueOf将字符串转换成枚举对象,要求字符串必须 为已有的常量名,否则报异常!
compareTo比较两个枚举常量,比较的就是编号
public class test1 {
    public static void main(String[] args) {
        Season winter = Season.WINTER;  //枚举对象
        //toString方法
        System.out.println(winter.toString());
        System.out.println("==============================");
        //name方法
        System.out.println(winter.name());
        System.out.println("==============================");
        //ordinal方法
        System.out.println(winter.ordinal());
        System.out.println("==============================");
        //values方法
        Season[] values = Season.values();
        for (Season season : values) {  //增强for循环
            System.out.println(season);
        }
        System.out.println("==============================");
        //valueOf方法,从Season去寻找有没有SPRING这个枚举对象
        //如果有,返回该枚举对象,如果没有,则报错
        System.out.println(Season.valueOf("SPRING"));
//        System.out.println(Season.valueOf("aaaaaa"));     //报错:No enum constant com.test.Season.aaaaaa

        //compareTo方法的值为   源码:return self.ordinal - other.ordinal;
        System.out.println("==============================");
        System.out.println(winter.compareTo(Season.SUMMER));   //-2
        System.out.println(winter.compareTo(Season.SPRING));   //1
    }
}

enum Season{
    //枚举对象对象,中间用逗号间隔,且必须放在枚举类首行
    SPRING("春天","温暖"),WINTER("冬天","寒冷"),
    AUTUMN("秋天","凉爽"),SUMMER("夏天","炎热");//最后是一个无参构造器

    private String name;
    private String desc;


    //构造器私有化
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    //重写了Enum中的toString方法
//    @Override
//    public String toString() {
//        return "Season{" +
//                "name='" + name + '\'' +
//                ", desc='" + desc + '\'' +
//                '}';
//    }
}

二、注解

1.基本介绍

注解(Annotation):也被称为元数据(Metadata),用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息。和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。

在 JavaSE 中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在 JavaEE 中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替 java EE 旧版中所遗留的繁冗代码和 XML 配置等。

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

2.三个基本的Annotation

名称功能
@Override限定某个方法,是重写父类方法, 该注解只能用于方法
@Deprecated用于表示某个程序元素(类, 方法等)已过时
@SuppressWarnings抑制编译器警告

(1)@Override的使用

interface A{
    void test();
}

class B implements A{
    @Override
    public void test() {
        System.out.println("重写了接口的抽象方法");
    }
}

@Target是修饰注解的注解,称为元注解

(2)@Deprecated的使用

public class test1 {
    public static void main(String[] args) {
        A a = new A();  //在IDEA开发工具中A中间就会有一个下划线
        a.test();	//test中间也会有一个下划线
    }
}

@Deprecated   //表示该元素已经过时,但是不代表不能用
class A{
	@Deprecated
    public void test(){
        System.out.println("AAA");
    }
}

(3)@SuppressWarnings的使用

格式
@SuppressWarnings{“”} //引号中写入需要抑制的警告,可以写多个 中间用逗号隔开
示例:
@SuppressWarnings{“null”,“unused”} 表示抑制空值和不被使用变量的警告
@SuppressWarnings{“all”} 表示抑制所有警告
还有很多就不一 一演示了

public class test1 {
    public static void main(String[] args) {
        A a = new A();
        a.test();
    }
}

class A{
    @SuppressWarnings("unused")
    int a = 1;  //当a没有被使用时会出现一个警告提示,写上面的注解可以抑制这种警告
    public void test(){
        System.out.println("AAA");
    }
}

3.元注解

元注解本身作用不大,主要用于看注解的源码,了解一下什么意思即可

基本介绍
JDK的元注解用于修饰其他注解

名称功能
@Retention指定注解的作用范围,三种 SOURCE,CLASS,RUNTIME
@Target指定注解可以在哪些地方使用
@Documented指定该注解是否会在 javadoc 体现
@Inherited子类会继承父类注解

下图表示的是@Override重写注解的一个源码
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王博1999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值