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)

大家都在看

  • Spring 学习笔记

    Spring 框架是由于软件开发的复杂性而创建的。Spring 使用的是基本的 JavaBean 来完成以前只可能由 EJB 完成的事情。 Spring 一. Spring Fra…

    数据库 2023年6月11日
    083
  • kettle插入更新

    kettle实现若主键存在则更新,若主键不存在则插入 Original: https://www.cnblogs.com/cheng9999/p/14085922.htmlAuth…

    数据库 2023年6月16日
    072
  • 容器化 | 在 S3 实现定时备份

    让我们来看看该功能是如何使用的。 [En] Let’s take a look at how this feature is used. 可用 Cron 表达式(与 L…

    数据库 2023年5月24日
    072
  • leetcode 144. Binary Tree Preorder Traversal 二叉树展开为链表(中等)

    一、题目大意 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root = [1,null,2,3]输出:[1,2,3] 示例 2: 输入:root…

    数据库 2023年6月16日
    091
  • MySQL特性:ICP,Index Condition Pushdown

    ICP,Index Condition Pushdown 理解ICP特性前,先去前面理解MRR特性,了解where条件中的三阶段提取: index key、index filter…

    数据库 2023年6月16日
    080
  • LeetCode 35. 搜索插入位置

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 …

    数据库 2023年6月11日
    070
  • MySQL InnoDB索引原理

    数据库与I/O原理 数据会持久化到磁盘,查询数据是就会有I/O操作,相对于缓存操作,I/O操作的时间成本相当高昂。 I/O操作的基本单位是一个磁盘页面,比如16KB的页面大小。当数…

    数据库 2023年6月14日
    093
  • flowable 查询、完成、作废、删除 任务

    /** * 查询我的任务 * from fhadmin.cn * @param USERNAME * @return 返回任务列表 */ protected List findMy…

    数据库 2023年6月6日
    0212
  • Mysql数据库体系

    Mysql数据库体系如下(手绘): 描述: 1.DBMS:database system management是数据库管理软件,平时我们使用的数据库的全称,是C/S架构(clien…

    数据库 2023年6月6日
    092
  • Java正则表达式Pattern和Matcher类详解

    概述 Pattern类的作用在于编译正则表达式后创建一个匹配模式. Matcher类使用Pattern实例提供的模式信息对正则表达式进行匹配 Pattern类 常用方法及介绍 Pa…

    数据库 2023年6月11日
    099
  • 分享一个有意思的错误

    subList方法拆分集合问题 JAVA技术交流群:737698533 分享一个有意思的错误,先看代码 public static void main(String[] args)…

    数据库 2023年6月16日
    0105
  • 2022-8-20 数据库连接池

    1. 概念:其实就是一个容器(集合),存放数据库连接的容器。 当系统初&#x59CB…

    数据库 2023年6月14日
    0123
  • 腾讯云linux系统安装FTP操作

    命令 rpm -qa | grep vsftpd 来查看是否安装相应的包ftp 如下图已安装 一:安装FTP: 1、命令:yum install -y vsftpd 2、装之后首先…

    数据库 2023年6月11日
    060
  • 0. 数据库设计规范化

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月16日
    0106
  • ArrayList

    ArrayList与数组的区别: 1. 数组和ArrayList的本质区别在于前者是类型安全的,而后者是类型不安全的.2. ArrayList为了兼容所有类型对象,使用了Objec…

    数据库 2023年6月16日
    099
  • SQL Server如何修改登录密码

    SQL Server如何修改登录密码 我们在打开SQLserver的时候一般选择的是”Windows身份认证”进行登录,如果选择混合模式该怎么登录呢?或者忘…

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