带你了解Java高级编程-----枚举类和注解

一、枚举类

  • Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。

  • Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。

  • 关于枚举类的使用
    1.枚举类的理解: 类的对象只有有限个,确定的(不能再去构造,需要私有化构造器),称此类为枚举类 ;
    2.当需要定义一组常量时,强烈建议使用枚举类 ;
    3.如果枚举类中只有一个对象,则可以作为单例模式的实现方式;

1.自定义枚举类

  • 方式 1 : jdk 5.0之前,自定义枚举类
  • 方式 2 : jdk 5.0,可以使用enum关键字定义枚举类
/* 定义一年四季的枚举类 */
public class SeasonTest {
    public static void main(String[] args) {
        Season spring = Season.SPRING;
        Season summer = Season.SUMMER;
        System.out.println(spring);
        summer.show();

    }
}

interface Info{
    void show();
}

//自定义枚举类
class Season implements Info{
    //1.声明Season对象的属性 : private final 修饰
    private final String seasonName;
    private final String seasonDesc;

    //2.私有化类的构造器 : 并给对象属性赋值
    private Season(String seasonName,String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    //3.提供当前枚举类的多个对象 : public static final的
    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("冬天","冰天雪地");

    //4.其他诉求1 : 获取枚举类对象的属性
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

    //4.提供诉求2 : toString
    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }

    @Override
    public void show() {
        System.out.println("这是接口 --- 季节");
    }
}

2.使用关键字enum定义枚举类

/**
 * 使用enum关键字定义枚举类
 * 【相比自定义枚举类,enum在提供枚举类对象时,不必太过繁琐】
 * 说明 : 定义的枚举类默认继承于class java.lang.Enum类
 */
public class SeasonTest1 {
    public static void main(String[] args) {
        Season1 spring = Season1.SPRING;
        Season1 winter = Season1.WINTER;
        System.out.println(Season1.class.getSuperclass());
        //toString():
        System.out.println(winter.toString());
        System.out.println("************************************");
        //values():
        Season1[] values = Season1.values();
        for (int i = 0; i < values.length; i++){
            System.out.println(values[i]);
            values[i].show();
        }
        System.out.println("************************************");
        Thread.State[] values1 = Thread.State.values();
        for (int i = 0; i < values1.length; i++) {
            System.out.println(values1[i]);
        }
        System.out.println("**************************");
        //valueOf(String objName) : 返回枚举类中对象名是objName 的对象
        /*
        Season1 winter2 = Season1.valueOf("WINTER2");
        System.out.println(winter2);*/
        //如果没有objName的枚举类对象,则抛异常:IllegalArgumentException
        Season1 winter1 = Season1.valueOf("WINTER");
        System.out.println(winter1);


    }
}

//定义接口
interface Info1{
    void show();
}

//自定义枚举类
enum Season1 implements Info1{
    //1.提供当前枚举类的多个对象 , 多个对象之间用“,”隔开,末尾对象用“;”结束
    SPRING("春天","春暖花开"){
        @Override
        public void show() {
            System.out.println("春天到了");
        }
    },
    SUMMER ("夏天","夏日炎炎"){
        @Override
        public void show() {
            System.out.println("夏天到了");
        }
    },
    AUTUMN ("秋天","秋高气爽"){
        @Override
        public void show() {
            System.out.println("秋天到了");
        }
    },
    WINTER("冬天","冰天雪地"){
        @Override
        public void show() {
            System.out.println("冬天到了");
        }
    };

    //2.声明Season对象的属性 : private final 修饰
    private final String seasonName;
    private final String seasonDesc;

    //3.私有化类的构造器 : 并给对象属性赋值
    private Season1(String seasonName, String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }


    //4.其他诉求1 : 获取枚举类对象的属性
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

    //4.提供诉求2 : toString
    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }

}

运行结果:
在这里插入图片描述

3.Enum类的主要方法

values(), ordinal() 和 valueOf() 方法

enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Seriablizable 和java.lang.Comparable 两个接口。

  • values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:
  • values() 返回枚举类中所有的值。
  • ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
  • valueOf()方法返回指定字符串值的枚举常量。

4.实现接口的枚举类

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

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

本文,展示的代码全部为实现接口的枚举类;如果不需要实现接口,去掉即可。

5.两种枚举的最主要区别:

  • 自定义枚举类比enum类更加繁琐一点
  • 两者定义过程分别如下:

自定义枚举类:
1.声明要自定义类的对象的属性:private final 修饰;
2.私有化类的构造器,给对象赋值;
3.提供当前枚举类的多个对象:public static final ;

enum类枚举:
1.提供当前枚举类的多个对象,多个对象之间用‘ ,’隔开,末尾对象用‘ ;’结束;
2.声明要定义类的对象的属性:private final 修饰;
3.私有化类的构造器,给对象赋值;

二、注解的使用

1.概述

  • Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
  • Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。

2.注解实例

内置的注解
Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。

作用在代码的注解是

注解名称注解作用
@Override检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
@Deprecated标记过时方法。如果使用该方法,会报编译警告。
@SuppressWarnings指示编译器去忽略注解中声明的警告。

作用在其他注解的注解(元注解):

注解名称注解作用
@Retention标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
@Documented标记这些注解是否包含在用户文档中。
@Target标记这个注解应该是哪种 Java 成员。
@Inherited标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)

从 Java 7 开始,额外添加了 3 个注解:

注解名称注解作用
@SafeVarargsJava 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
@FunctionalInterfaceJava 8 开始支持,标识一个匿名函数或函数式接口。
@RepeatableJava 8 开始支持,标识某注解可以在同一个声明上使用多次。

3.自定义Annotation

  • 如何自定义注解 : 参照@SuppressWarnings定义

① 注解声明为: @interface
② 内部定义成员,通常使用value表示
③可以指定成员的默认值,使用default定义
④ 如果自定义注解没有成员,表明是一个标识作用
【如果注解没有成员,在使用注解时,需要指明成员的值】

public @interface MyAnnotation {

    String value() default "hello";

}
public class AnnotationTest {
    public static void main(String[] args) {
        Person p = new Stu();
        p.eat();
        Date date = new Date();
        System.out.println(date);
    }
}

@MyAnnotation()
class Person{
    @SuppressWarnings("unsued")
    private String name;
    private int age;

    public Person(){

    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void walk(){
        System.out.println("人走路");
    }

    public void eat(){
        System.out.println("人吃饭");
    }
}



interface Info{
    void show();
}

class Stu extends Person implements Info{
    @Override
    public void walk() {
        System.out.println("学生走路");
    }

    @Override
    public void show() {
        System.out.println("快看,接口!");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

符工爱奇

欢迎投币支持(●'◡'●)

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

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

打赏作者

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

抵扣说明:

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

余额充值