Java学习-第一部分-第二阶段-第二节:枚举和注释

自定义类实现枚举

先看一个需求

要求创建季节(Season)对象,请设计并完成。

创建Season对象有如下特点

1.季节的值是有限的几个值(spring, summer, autumn, winter)

2.只读,不需要修改。

public class Test {
    public static void main(String[] args) {
        //使用
        Season spring = new Season("春天", "温暖");
        Season winter = new Season("冬天","寒冷");
        Season summer = new Season("夏天","炎热");
        Season autumn = new Season("秋天","凉爽");
        //autumn.setName("XXX");
        //autumn.setDesc("非常的热..");
        //因为对于季节而已,他的对象(具体值),是固定的四个,不会有更多
        //按照这个设计类的思路,不能体现季节是固定的四个对象
        //因此,这样的设计不好===>枚举类[枚:一个一个举:例举,即把具体的对象一个一个例举出来的类
        //就称为枚举类]
        Season other = new Season("红天","~~" );
    }
}
class Season {
    private String name;
    private String desc;//描述
    public Season(String name, String desc) {this.name = name;this.desc = desc;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public String getDesc() { return desc;}
    public void setDesc(String desc) {this.desc = desc;}
}

解决方案-枚举

枚举的二种实现方式

package enum_;

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

//演示定义枚举实现
class Season {
    private String name;
    private String desc;//描述

    //定义了四个对象,固定.

    public static final Season SPRING = new Season("春天","温暖");
    public static final Season WINTER = new Season("冬天","寒冷");
    public static final Season AUTUMN = new Season("秋天","凉爽");
    public static final Season SUIMMER = new Season("夏天","炎热");

    //1.将构造器私有化,目的防止直接new
    //2.去掉setXxx方法,防止属性被修改
    //3.在Season内部,直接创建固定的对象
    //4.优化,可以加入final修饰符
    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关键字实现枚举

使用enum来实现前面的枚举案例,看演示,主要体会和自定义类实现枚举不同的地方。

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

//演示定义枚举实现
enum Season {
    //定义了四个对象,固定.

//    public static final Season SPRING = new Season("春天","温暖");
//    public static final Season WINTER = new Season("冬天","寒冷");
//    public static final Season AUTUMN = new Season("秋天","凉爽");
//    public static final Season SUIMMER = new Season("夏天","炎热");

    //如果使用了enum来实现枚举类//1。使用关键字 enum替代 class
    //2. public static final Season SPRING = new Season("春天","温暖")直接使用//SPRING("春天","温暖"))解读常量名(实参列表I
    //3.如果有多个常量(对象),使用,号间隔即可
    //4.如果使用enum 来实现枚举,要求将定义常量对象,写在前面
    SPRING("春天", "温暖"), WINTER("冬天", "寒冷");;

    private String name;
    private String desc;//描述

    //1.将构造器私有化,目的防止直接new
    //2.去掉setXxx方法,防止属性被修改
    //3.在Season内部,直接创建固定的对象
    //4.优化,可以加入final修饰符
    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关键字实现枚举注意事项

举例说明enum常用的方法的使用

public class Test {
    public static void main(String[] args) {
        //使用Season2枚举类,来演示各种方法
        Season2 autumn = Season2.AUTUMN;
        //输出枚举对象的名字
        System.out.println(autumn.name());
        //ordinal()输出的是该枚举对象的次序/编号,从0开始编号
        // AUTUMN枚举对象是第三个,因此输出2
        System.out.println(autumn.ordinal());
        //从反编译可以看出values方法,返回Season2[]
        //含有定义的所有枚举对象
        Season2[] values = Season2.values();
        System.out.println("===遍历取出枚举对象(增强for)====");
        for (Season2 season : values) {//增强for循环
            System.out.println(season);
        }
        //valueOf:将字符串转换成枚举对象,要求字符串必须VT为已有的常量名,否则报异常
        // 执行流程
        // 1.根坍你输入的"AUTUMN "到Season2的枚举对象去查找
        // 2.如果找到了,就返回,.如果没有找到,就报错
        Season2 autumn1 = Season2.valueOf("AUTUMN");
        System.out.println("autumn1=" + autumn1);
        System.out.println(autumn == autumn1);
        //compareTo:比较两个枚举常量,比较的就是编号
        //2.看看结果
        /*
        public final int compareTo(E o) {
            return self.ordinal - other.ordinal;
        }
        Season2.AUTUMN的编号[3] - Season2.SUMMER的编号[1]
        */
        System.out.println(Season2.AUTUMN.compareTo(Season2.SUMMER));//3-1
    }
}
//演示定义枚举实现
enum Season2 {
    //定义了四个对象,固定.

    //    public static final Season SPRING = new Season("春天","温暖");
    //    public static final Season WINTER = new Season("冬天","寒冷");
    //    public static final Season AUTUMN = new Season("秋天","凉爽");
    //    public static final Season SUMMER = new Season("夏天","炎热");
    //如果使用了enum来实现枚举类//1。使用关键字 enum替代 class
    //2. public static final Season SPRING = new Season("春天","温暖")直接使用//SPRING("春天","温暖"))解读常量名(实参列表I
    //3.如果有多个常量(对象),使用,号间隔即可
    //4.如果使用enum 来实现枚举,要求将定义常量对象,写在前面
    SPRING("春天", "温暖"),
    SUMMER("夏天", "炎热"),
    WINTER("冬天", "寒冷"),
    AUTUMN;
    Season2() {
    }
    private String name;
    private String desc;//描述
    //1.将构造器私有化,目的防止直接new
    //2.去掉setXxx方法,防止属性被修改
    //3.在Season内部,直接创建固定的对象
    //4.优化,可以加入final修饰符
    private Season2(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
    public String getName() {return name;}
    public String getDesc() { return desc;}
}

JDK内置的基本注解类型(了解就行)

注解的理解

基本的Annotation介绍

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

三个基本的Annotation:

Override:限定某个方法,是重写父类方法,该注解只能用于方法

class Father{
    public void fly(){
        System.out.println("Father fly.....");
    }
}
class Son extends Father {
    //解读
    //1.@Override 注解放在fly方法上,表示子类的fly方法时重写了父类的fly
    //2.这里如果没有写@0verride还是重写了父类fly
    //3.如果你写了@Override注解,编译器就会去检查该方法是否真的重写了父类的
    // 方法,如果的确重写了,则编译通过,如果没有构成重写,则编译错误
    /*
        @Target(ElementType.HETHOD)
        @Retention(RetentionPolicy.SOURCE)
        public @interface Override {
        }
    */
    @Override  //说明
    public void fly() {
        System.out.println("Son fly...");
    }
}

补充说明:@interface的说明

@interface不是interface,是注解类,是jdk5.0之后加入的

>Override使用说明

@Deprecated的说明

@Deprecated
class A{

}

@SuppressWarnings:抑制编译器警告

//关于SuppressWarnings作用范围是和你放置的位置相关
//看看@SuppressWarnings 源码
/*
    @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
    @Retention(RetentionPolicy.SOURCE)
    public @interface SuppressWarnings {
        String[] value();
    }
*/
@SuppressWarnings({"unused","unchecked"})
public class Test {
    public static void main(String[] args) {
        int i;//没有 @SuppressWarnings({"unused"})会出现黄色警告:i没有被使用
    }
}

说明各种值

元注解:对注解进行注解(不重要,仅需了解)

元注解的基本介绍

JDK的元 Annotation用于修饰其他Annotation

元注解:本身作用不大,讲这个原因主要用来辅助理解源码。看源码时,可以知道他是干什么.

元注解的种类(使用不多,了解,不用深入研究)

只能用于修饰一个 Annotation定义,用于指定该 Annotation可以保留多长时间,@Rentention包含一个 RetentionPolicy类型的成员变量,使用@Rentention时必须为该vajue成员变量指定值:

@Retention的三种值

基本说明

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

@Documented
@Retention(RetentionPolicy.RUNTIME)//它的作用范围是RUNTIME
@Target(ElementType.ANNOTATION_TYPE)//这里的ANNOTATION TYPE 说明@Target只能修饰注解
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的取值//通过Enum 比如:TYPE等

}

基本说明

@Documented:用于指定被该元 Annotation修饰的Annotation类将被javadoc工具提取成文档,即在生成文档时,可以看到该注解。

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

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD,LOCAL_VARIABLE, METHOD, PACKAGE,PARAMETER, TYPE)
public @interface Deprecated {//一个Deprecated 注解@Documented,则javadoc会看到Deprecated
}

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

说明:实际应用中,使用较少,了解即可。

元注解:本身作用不大,讲这个原因希望编程看源码时,可以知道他是干什么。

Original: https://www.cnblogs.com/wenjie2000/p/16574113.html
Author: 文杰2000
Title: Java学习-第一部分-第二阶段-第二节:枚举和注释

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/598866/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java8 Stream

    什么是Stream Java8 API添加了一个新的抽象称为流Stream,可以以一种声明的方式处理数据,给我们操作集合(Collection)提供了极大的便利。Stream将要处…

    数据库 2023年6月6日
    080
  • 事务的本质和死锁的原理・改

    由于一些错误操作和被爬的原因,我重新整理了 上一篇文章https://…

    数据库 2023年6月9日
    075
  • 【MySQL】MySQL的安装、卸载、配置、登陆和退出

    1 MySQL安装 安装环境:Win10 64位软件版本:MySQL 5.7.24 解压版 1.1 下载 https://downloads.mysql.com/archives/…

    数据库 2023年5月24日
    082
  • Redis的五大数据类型(简单使用)

    redis是基于内存的,内存的读写速度非常快 ; redis是单线程的,省去了很多上下文切换线程的时间; *redis因为是基于内存的 不涉及io操作 所以单线程效率是最高的 回归…

    数据库 2023年6月6日
    084
  • 2022-08-20 数据库连接池

    每次去初始化一个连接池,连接池中会有很多个连接等待被使用,使用完连接之后,不需要关闭连接,只需要把连接还回到连接池,还回到连接池的操作不需要我们手动控制。 数据库连接池负责分配、管…

    数据库 2023年6月14日
    079
  • 部署tomcat

    tomcat tomcat 一、tomcat是什么 二、tomcat部署 1.实现访问java测试网页 2.能够成功登录到tomcat首页中的host manager、server…

    数据库 2023年6月14日
    043
  • MySQL 服务无法启动。服务没有报告任何错误。

    版本8.0.25,今天启动发现抱错,网上搜索一下发现这样可行 启动MySQL报错: 搜索了一下,按照这样步骤解决了 1.配置一下my.ini [mysqld] basedir =&…

    数据库 2023年6月16日
    070
  • 绿色安装MySQL5.7版本—-配置my.ini文件注意事项

    简述绿色安装MySQL5.7版本以及配置my.ini文件注意事项 前言 由于前段时间电脑重装,虽然很多软件不在C盘,但是由于很多注册表以及关联文件被删除,很多软件还需要重新配置甚至…

    数据库 2023年5月24日
    089
  • 互联网大厂那些儿“高逼格”词汇

    转载请注明出处❤️ 你好,我是测试蔡坨坨。 目前任职于上海某互联网公司测试开发工程师。 相信在互联网公司上班的同学,日常工作中一定听过不少互联网那些”高(zhuang)…

    数据库 2023年6月11日
    0148
  • springmvc静态资源配置

    <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>o…

    数据库 2023年6月16日
    086
  • springboot~RedisTemplate三种序列化方式

    RedisTemplate默认使用二进制hex的方式进行持久化,它对象的值存储到redis里,当然,你的对象需要先实现 java.io.Serializable接口,这种方式兼容性…

    数据库 2023年6月6日
    0189
  • 一文了解Cookie

    Cookie 什么是 Cookie? 先要了解HTTP是 无状态的Web服务器,什么是无状态呢?一次对话完成后下一次对话完全不知道上一次对话发生了什么。如果在Web服务器中只是用来…

    数据库 2023年6月11日
    089
  • Office直通车

    数据库篇 数据库架构 为什么要使用索引? 对于数据量较大的表,建立索引避免全表扫描,能够提高查询速度,提高效率 什么样的信息能成为索引? 主键、唯一键、普通键 索引数据结构? 主流…

    数据库 2023年6月6日
    0274
  • 我的JAVA面试题备忘录

    以下是我收集的一些问题,有的是网上摘录的,有的是自己参加面试被问到的,有的是工作或学习时遇到的,等等。 为什么要记录这些呢? 一方面,我相信,这样做对我自己的技术提升是有帮助的。在…

    数据库 2023年6月6日
    049
  • MySQL函数学习(二)—–数值型函数

    注:笔记旨在记录 二、MySQL 数值型函数 \ 函 数 名 称 作 用 完 成 1 RAND 取随机数,可设置参数种子 勾 2 ABS 求x的绝对值 勾 3 SIGN 求x的正负…

    数据库 2023年6月16日
    072
  • JavaScript进阶知识点——函数和对象详解

    我们在上期内容中学习了JavaScript的基本知识点,今天让我们更加深入地了解JavaScript JavaScript函数 JavaScript函数和Java函数是有一部分相似…

    数据库 2023年6月14日
    077
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球