【JavaSE】枚举和注解学习笔记

枚举和注解

-枚举

  • 规定多选一数据类型的解决方案-枚举

    1. 枚举对应英文(enumeration,简写 enum)
      2)枚举是一组常量的集合。
      3)可以这里理解:枚举属于一种特殊的类,里面只包含一组有限的特定的对象。
  • 枚举的两种实现方式

    1. 自定义实现枚举

    2. 使用enum关键字实现枚举

  • 自定义类实现枚举

    1. 不需要提供setXxx 方法,因为枚举对象值通常为只读.

    2. 对枚举对象/属性使用 final + static 共同修饰,实现底层优化

    3. 枚举对象名通常使用全部大写,常量的命名规范

    4. 枚举对象根据需要,也可以有多个属性

  • 自定义类实现枚举小结

    • 小结:进行自定义类实现枚举,有如下特点:

      1. 构造器私有化

      2. 本类内部创建一组对象

      3. 对外暴露对象(通过为对象添加public final static修饰符)

      4. 可以提供 get方法,但是不要提供 set

-enum枚举类

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

    1. 当我们使用enum关键字开发一个枚举类时,默认会继承Enum类,而且是一个final类,用javap(反编译 )工具可以验证

    2. 传统的public static final Season2 SPRING = new Season2(“春天”,“温暖”);简化成SPRING(“春天”,“温暖”),这里必须知道,它调用的是哪个构造器。

    3. 如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略

    4. 当有多个枚举对象时,使用","间隔,最后一个分号结尾

    5. 枚举对象必须放在枚举类的行首

  • enum常用方法说明

    说明:使用enum关键字时,会隐式继承Enum类,这样我们就可以使用Enum类相关方法。(看以下源码定义)

    public abstract class Enum<E extends Enum<E>>
    implements Comparable<E>, Serializable{}
    
    1. toString:Enum类已经重写该方法,返回的是当前对象名,子类可以重写该方法,用于返回对象的属性信息
    2. name:可以返回当前对象名(常量名),子类中不能重写
    3. oridnal:返回当前对象的位置号,默认从0开始
    4. values:返回当前枚举类中所有常量
    5. valuesOf:将字符串转换成枚举对象,要求字符串必须为已有常量名,否则报异常
    6. compareTo:比较两个枚举常量,比较的就是编号
    package com.xijie.enum_;/*** 演示Enum枚举的使用* 记录红绿灯颜色、时间、说明的枚举*/
    public enum TrafficLightEnum {//枚举对象,访问权限是私有、类成员、常量,实现了抽象方法GREEN(30,"绿灯代表可以通行"){@Overridepublic String getAction() {return "请通行";}},YELLOW(3,"黄灯代表准备刹车") {@Overridepublic String getAction() {return "请刹车";}},RED(35,"红灯代表禁止通行") {@Overridepublic String getAction() {return "请停车";}};//私有常量成员变量private final int durationTime;private final String info;//私有构造方法TrafficLightEnum(int durationTime, String info) {//信号灯时间this.durationTime = durationTime;this.info = info;}//get方法public int getDurationTime() {return durationTime;}public String getInfo() {return info;}//抽象方法,由枚举对象实现public abstract String getAction();
    }
    package com.xijie.enum_;public class TrafficLightEnumTest {public static void main(String[] args) {//TrafficLightEnum枚举类的基本使用TrafficLightEnum greenLight = TrafficLightEnum.GREEN;TrafficLightEnum greenLight2 = TrafficLightEnum.GREEN;TrafficLightEnum yellowLight = TrafficLightEnum.YELLOW;TrafficLightEnum redLight = TrafficLightEnum.RED;//比较两个绿灯是否相同System.out.println("两个绿灯是否相同:"+(greenLight==greenLight2));//比较红灯和黄灯是否相同System.out.println("红灯和黄灯是否相同:"+(redLight==yellowLight));//访问黄灯的所有成员及自定义方法System.out.println("黄灯的名字叫:"+yellowLight.name());System.out.println("黄灯的意思是:"+yellowLight.getInfo());System.out.println("黄灯亮时应该:"+yellowLight.getAction());//enum方法演示//toString:Enum类已经重写该方法,返回的是当前对象名,子类可以重写该方法,用于返回对象的属性信息System.out.println("绿灯的名字是"+greenLight.toString());System.out.println("黄灯的名字是"+yellowLight.toString());System.out.println("红灯的名字是"+redLight.toString());//name:可以返回当前对象名(常量名),子类中不能重写System.out.println("绿灯的常量名是"+greenLight.name());System.out.println("黄灯的常量名是"+yellowLight.name());System.out.println("红灯的常量名是"+redLight.name());//oridnal:返回当前对象的位置号,默认从0开始System.out.println("绿灯的位置号是"+greenLight.ordinal());System.out.println("黄灯的位置号是"+yellowLight.ordinal());System.out.println("红灯的位置号是"+redLight.ordinal());//values:返回当前枚举类中所有常量TrafficLightEnum[] enums = TrafficLightEnum.values();for(TrafficLightEnum e:enums){System.out.println(e.name());}//valuesOf:将字符串转换成枚举对象,要求字符串必须为已有常量名,否则报异常String redStr="RED";TrafficLightEnum red = TrafficLightEnum.valueOf(redStr);System.out.println("字符串转换为枚举对象:"+red.name());//compareTo:比较两个枚举常量,比较的就是编号System.out.println("比较绿灯和绿灯:"+greenLight.compareTo(greenLight2));System.out.println("比较黄灯和红灯:"+yellowLight.compareTo(redLight));System.out.println("比较红灯和黄灯:"+redLight.compareTo(yellowLight));System.out.println("比较红灯和绿灯:"+redLight.compareTo(greenLight));}
    }
  • 一个练习-用三种方法定义枚举常量的别名

    package com.xijie.enum_;public enum DayOfWeekEnum {//重写toString方法也可以返回自定义字符串MONDAY("星期一"){@Overridepublic String getChineseNameOfTheDay() {return "星期一";}@Overridepublic String toString() {return "星期一";}},TUESDAY("星期二"){@Overridepublic String getChineseNameOfTheDay() {return "星期二";}@Overridepublic String toString() {return "星期二";}},WEDNESDAY("星期三"){@Overridepublic String getChineseNameOfTheDay() {return "星期三";}@Overridepublic String toString() {return "星期三";}},THURSDAY("星期四"){@Overridepublic String getChineseNameOfTheDay() {return "星期四";}@Overridepublic String toString() {return "星期四";}},FRIDAY("星期五"){@Overridepublic String getChineseNameOfTheDay() {return "星期五";}@Overridepublic String toString() {return "星期五";}},SATURDAY("星期六"){@Overridepublic String getChineseNameOfTheDay() {return "星期六";}@Overridepublic String toString() {return "星期六";}},SUNDAY("星期天"){@Overridepublic String getChineseNameOfTheDay() {return "星期天";}@Overridepublic String toString() {return "星期天";}},;//存储星期日期的中文名称private final String chineseName;DayOfWeekEnum(String chineseName) {this.chineseName=chineseName;}//get方法public String getChineseName() {return chineseName;}//使用抽象方法也可以起到同样的效果public abstract String getChineseNameOfTheDay();
    }
    

package com.xijie.enum_;public class DayOfWeekTest {public static void main(String[] args) {//通过获取枚举对象的成员方法获取自定义星期名称System.out.println("==所有星期的信息如下==");for (DayOfWeekEnum dayEnum : DayOfWeekEnum.values()) {System.out.println(dayEnum.getChineseName());}//通过自定义抽象方法获取自定义星期名称System.out.println("==所有星期的信息如下==");for (DayOfWeekEnum dayEnum : DayOfWeekEnum.values()) {System.out.println(dayEnum.getChineseNameOfTheDay());}//通过重写的toString方法获取自定义星期名称System.out.println("==所有星期的信息如下==");for (DayOfWeekEnum dayEnum : DayOfWeekEnum.values()) {System.out.println(dayEnum);}}
}
  • 枚举类的注意事项

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

    2.枚举类和普通类一样,可以实现接口,如下形式:

    enum 类名 implements 接口1, 接口2...{}

-注解

  • 注解的理解

    1. 注解(Annotation)也被称为元数据(Metadata),用于修饰解释包、类、方法、属性、构造器、局部变量等数据信息。
    2. 和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。
    3. 在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替javaEE旧版中所遗留的繁冗代码和XML配置等。
  • 基本的Annotation介绍

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

    • 三个基本的Annotation
      1. @Override:限定某个方法,是重写父类方法,该注解只能用于方法
      2. @Deprecated:用于表示某个程序元素(类,方法等)已经过时
      3. @SuppressWarnings:抑制编译器警告
  • @Override简介

    1. @Override限定某个方法是重写了父类方法,该注解只能用于方法,不能修饰类、包、属性等
    2. @Override注解写在方法上方
    3. 如果没有写@Override,该重写还是会重写
    4. 如果写了@Override注解,编译器在编译时就会检查该方法是否真的重写了父类方法,如果没有重写就会报错。
    5. 在@Override的定义中,@interface表示一个注解类,和interface表示接口不一样;@Target(ElementType.METHOD)表示该注解只能修饰方法;@Target是修饰注解的注解,是元注解。
  • @Deprecated简介

    1. @Deprecated注解表示某个程序的元素,比如方法、类已经过时了
    2. 但是该过时的元素还是可以用的,只是不推荐使用
    3. 通过查看@Deprecated的定义,可以知道该注解可用于构造器、成员变量、局部变量、方法、包、参数、类型。
    4. @Deprecated可以用于新老元素的过渡,比如将jdk8升级到jdk11时,可以将旧的类注解,推荐使用新的类。
  • @SupressWarnings简介

    1. 当我们不希望看到编译器警告的时候,可以使用@SupressWarnings注解来抑制警告信息

    2. 语法:@SupressWarnings({“”}),在大括号中可以写入希望抑制的警告信息类型的数组

    3. @SuppressWarnings 常用参数列表(JDK 8)

      参数名用途
      all抑制所有类型的警告(最宽泛的用法)。
      unchecked抑制 “未检查的类型转换” 警告(如泛型擦除导致的警告)。
      deprecation抑制 “使用已过时的类或方法” 警告。
      rawtypes抑制 “使用原始类型(raw type)” 警告(如 List 而非 List<String>)。
      unused抑制 “未使用的变量 / 方法 / 类” 警告。
      null抑制 “可能的空指针引用” 警告。
      serial抑制 “实现 Serializable 接口但未定义 serialVersionUID” 警告。
      finally抑制 “finally 块无法正常完成” 警告(如 finally 中存在 return)。
      fallthrough抑制 “switch 语句缺少 break” 警告(允许 case 穿透)。
      path抑制 “类路径或源路径中的不存在的路径” 警告。
      boxing抑制 “装箱 / 拆箱操作” 警告(如 intInteger 之间的自动转换)。
      cast抑制 “不必要的类型转换” 警告(如 (String) obj 但 obj 已确定为 String)。
      synthetic-access抑制 “内部类的实体访问” 警告(如内部类访问外部类的 private 成员)。
      nls抑制 “非国际化字符串文字” 警告(如直接使用硬编码的字符串)。
      restriction抑制 “使用不建议或禁止的引用” 警告(如使用已被 @Deprecated 标记的 API)。
    4. @SuppressWarnings写在哪个元素上,那么它的作用范围就是这个元素,比如写在类上就作用于整个类,写在方法上就作用于整个方法,写在语句上就只作用于这个语句。

    5. @SupressWarning的源码

      @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
      @Retention(RetentionPolicy.SOURCE)
      public @interface SuppressWarnings {String[] value();
      }
      

-元注解

  • 元注解基本介绍

    JDK的元用于修饰其他注解

    元注解:在平时开发业务需求时很少用到,但是在开发框架时非常重要

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

    1. Retention //指定注解的作用范围,三种:SOURCE、CLASS、RUNTIME
    2. Target //指定注解可以在哪些地方使用
    3. Documented//指定该注解是否会在javadoc中体现
    4. Inherited//子类会继承父类注解
  • @Retention注解

    • 说明

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

    • @Retention的三种值

      1. RetentionPolicy.SOURCE:编译器使用后,直接丢弃这种策略的注释
      2. RetentionPolicy.CLASS:编译器将把注释记录在class文件中。当运行Java程序时,JVM不会保留注解,这是默认值。
      3. RetentionPolicy.RUNTIME:编译器将把注释记录在class文件中,当运行Java程序时,JVM会保留注释,程序可以通过反射获取该注释
  • @Target注解

    • 说明

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

  • @Documented注解

    • 说明

      用于指定被该元Annotation修饰的Annotation类将被javadoc工具提取为文档,即在生成文档时,可以看到该注解。定义为Documented的注解必须设置Retention值为RUNTIME。

  • @Inherited注解

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/82563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark SQL进阶:解锁大数据处理的新姿势

目录 一、Spark SQL&#xff0c;为何进阶&#xff1f; 二、进阶特性深剖析 2.1 窗口函数&#xff1a;数据洞察的新视角 2.2 高级聚合&#xff1a;挖掘数据深度价值 2.3 自定义函数&#xff08;UDF 和 UDTF&#xff09;&#xff1a;拓展功能边界 三、性能优化实战 3.1 数…

如何利用 Conda 安装 Pytorch 教程 ?

如何利用 Conda 安装 Pytorch 教程 &#xff1f; 总共分为六步走&#xff1a; &#xff08;1&#xff09;第一步&#xff1a;验证conda 环境是否安装好&#xff1f; 1) conda -V2) conda --version&#xff08;2&#xff09;第二步&#xff1a;查看现有环境 conda env list…

什么是HTTP

HTTP&#xff08;HyperText Transfer Protocol&#xff09;是万维网数据通信的基础协议&#xff0c;作为应用层协议具有以下关键特性&#xff1a; 客户端-服务器模型&#xff1a;基于请求/响应模式 无状态协议&#xff1a;默认不保留通信状态 可扩展性&#xff1a;通过首部字…

2025-05-27 学习记录--Python-模块

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、模块 ⭐️ &#xff08;一&#xff09;模块的导入与使用 &#x1f36d; 模块的导入&#xff1a;&#x1f41d; 模块 就好比…

leetcode 131. Palindrome Partitioning

目录 一、题目描述 二、方法1、回溯法每次暴力判断回文子串 三、方法2、动态规划回溯法 一、题目描述 分割回文子串 131. Palindrome Partitioning 二、方法1、回溯法每次暴力判断回文子串 class Solution {vector<vector<string>> res;vector<string>…

重构开发范式!飞算JavaAI革新Spring Cloud分布式系统开发

分布式系统凭借高可用性、可扩展性等核心优势&#xff0c;成为大型软件项目的标配架构。Spring Cloud作为Java生态最主流的分布式开发框架&#xff0c;虽被广泛应用于微服务架构搭建&#xff0c;但其传统开发模式却面临效率瓶颈——从服务注册中心配置到网关路由规则编写&#…

python 生成复杂表格,自动分页等功能

py&#xff54;&#xff48;&#xff4f;&#xff4e; 生成复杂表格&#xff0c;自动分页等功能 解决将Python中的树形目录数据转换为Word表格&#xff0c;并生成带有合并单元格的检测报告的问题。首先&#xff0c;要解决“tree目录数据”和“Word表格互换”&#xff0c;指将树…

根据Cortex-M3(包括STM32F1)权威指南讲解MCU内存架构与如何查看编译器生成的地址具体位置

首先我们先查看官方对于Cortex-M3预定义的存储器映射 1.存储器映射 1.1 Cortex-M3架构的存储器结构 内部私有外设总线&#xff1a;即AHB总线&#xff0c;包括NVIC中断&#xff0c;ITM硬件调试&#xff0c;FPB, DWT。 外部私有外设总线&#xff1a;即APB总线&#xff0c;用于…

Linux中硬件信息查询利器——lshw命令详解!

lshw&#xff08;List Hardware&#xff09;是 Linux 系统下的一款命令行工具&#xff0c;用于全面检测并显示详细的硬件信息。它能够报告 CPU、内存、主板、存储设备、显卡、网络设备等几乎所有硬件组件的详细信息&#xff0c;适用于系统管理、故障排查和硬件兼容性检查等场景…

用llama3微调了一个WiFiGPT 用于室内定位

一段话总结 本文提出WiFiGPT,一种基于Decoder-Only Transformer(如LLaMA 3)的室内定位系统,通过将WiFi遥测数据(如CSI、FTM、RSSI)转换为文本序列进行端到端训练,无需手工特征工程即可实现高精度定位。实验表明,WiFiGPT在LOS环境中实现亚米级精度(MAE低至0.90米),在…

大模型系列22-MCP

大模型系列22-MCP 玩转 MCP 协议&#xff1a;用 Cline DeepSeek 接入天气服务什么是 MCP&#xff1f;环境准备&#xff1a;VScode Cline DeepSeek**配置 DeepSeek 模型&#xff1a;****配置 MCP 工具****uvx是什么&#xff1f;****安装 uv&#xff08;会自动有 uvx 命令&…

Go语言Map的底层原理

概念 map 又称字典&#xff0c;是一种常用的数据结构&#xff0c;核心特征包含下述三点&#xff1a; &#xff08;1&#xff09;存储基于 key-value 对映射的模式&#xff1b; &#xff08;2&#xff09;基于 key 维度实现存储数据的去重&#xff1b; &#xff08;3&#x…

循环神经网络(RNN):原理、架构与实战

循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一类专门处理序列数据的神经网络&#xff0c;如时间序列、自然语言、音频等。与前馈神经网络不同&#xff0c;RNN 引入了循环结构&#xff0c;能够捕捉序列中的时序信息&#xff0c;使模型在不同时间步之间…

java 项目登录请求业务解耦模块全面

登录是统一的闸机&#xff1b; 密码存在数据库中&#xff0c;用的是密文&#xff0c;后端加密&#xff0c;和数据库中做对比 1、UserController public class UserController{Autowiredprivate IuserService userservicepublic JsonResult login(Validated RequestBody UserLo…

【手写数据库核心揭秘系列】第9节 可重入的SQL解析器,不断解析Structure Query Language,语言翻译好帮手

可重入的SQL解析器 文章目录 可重入的SQL解析器一、概述 二、可重入解析器 2.1 可重入设置 2.2 记录状态的数据结构 2.3 节点数据类型定义 2.4 头文件引用 三、调整后的程序结构 四、总结 一、概述 现在就来修改之前sqlscanner.l和sqlgram.y程序,可以不断输入SQL语句,循环执…

微软开源bitnet b1.58大模型,应用效果测评(问答、知识、数学、逻辑、分析)

微软开源bitnet b1.58大模型,应用效果测评(问答、知识、数学、逻辑、分析) 目 录 1. 前言... 2 2. 应用部署... 2 3. 应用效果... 3 1.1 问答方面... 3 1.2 知识方面... 4 1.3 数字运算... 6 1.4 逻辑方面... …

用HTML5+JavaScript实现汉字转拼音工具

用HTML5JavaScript实现汉字转拼音工具 前一篇博文&#xff08;https://blog.csdn.net/cnds123/article/details/148067680&#xff09;提到&#xff0c;当需要将拼音添加到汉字上面时&#xff0c;用python实现比HTML5JavaScript实现繁琐。在这篇博文中用HTML5JavaScript实现汉…

鸿蒙OSUniApp 开发的动态背景动画组件#三方框架 #Uniapp

使用 UniApp 开发的动态背景动画组件 前言 在移动应用开发中&#xff0c;动态背景动画不仅能提升界面美感&#xff0c;还能增强用户的沉浸感和品牌辨识度。无论是登录页、首页还是活动页&#xff0c;恰到好处的动态背景都能让产品脱颖而出。随着鸿蒙&#xff08;HarmonyOS&am…

云原生技术架构技术探索

文章目录 前言一、什么是云原生技术架构二、云原生技术架构的优势三、云原生技术架构的应用场景结语 前言 在当今的技术领域&#xff0c;云原生技术架构正以一种势不可挡的姿态席卷而来&#xff0c;成为了众多开发者、企业和技术爱好者关注的焦点。那么&#xff0c;究竟什么是…

AWS之AI服务

目录 一、AWS AI布局 ​​1. 底层基础设施与芯片​​ ​​2. AI训练框架与平台​​ ​​3. 大模型与应用层​​ ​​4. 超级计算与网络​​ ​​与竞品对比​​ AI服务 ​​1. 机器学习平台​​ ​​2. 预训练AI服务​​ ​​3. 边缘与物联网AI​​ ​​4. 数据与AI…