JavaSE高级(4)——枚举和注解

一给  金牌会员 | 2024-9-28 11:38:01 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 994|帖子 994|积分 2982

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目录
一、枚举先容
二、实现枚举的两种方式
(一)自定义类实现枚举
(二)enum关键字实现枚举
三、enum常用方法说明
1.toString 
2.name
3.ordinal
4.value
5.valueOf
6.compareTo
四、Enum练习
五、enum利用细节——继承、接口
六、注解
(一)注解的理解
(二)根本的Annotation先容

一、枚举先容

        当我们创造一个Season对象的时候,因为Season只有4个(春夏秋冬)常量,不能更改,只能利用,且选择有限,此时创造Season对象就不太符合。
        枚举是一组常量的聚集,属于一种特殊的类,里面只包罗一组有限的特定的对象
        对于季节这种有固定值的,不能更改,就需要利用枚举。
二、实现枚举的两种方式

(一)自定义类实现枚举

   步骤:
  

  • 不需要提供setXxx方法,因为枚举对象值通常为只读;
  • 对枚举对象/属性利用static+final共同修饰,实现底层优化;
  • 枚举对象名通常利用全部大写,遵循常量的定名规范;
  • 枚举对象根据需要,也可以有多个属性。
  1. public class TestDemo {
  2.     public static void main(String[] args) {
  3.         System.out.println(Season.SPRING); // Season{name='春天', desc='温暖'}
  4.         System.out.println(Season.SUMMER); // Season{name='夏天', desc='炎热'}
  5.         System.out.println(Season.AUTUMN); // Season{name='秋天', desc='凉爽'}
  6.         System.out.println(Season.WINTER); // Season{name='冬天', desc='寒冷'}
  7.     }
  8. }
  9. // 自定义实现枚举
  10. class Season {
  11.     private String name;
  12.     private String desc;
  13.     // 定义四个对象
  14.     public static final Season SPRING = new Season("春天", "温暖");
  15.     public static final Season SUMMER = new Season("夏天", "炎热");
  16.     public static final Season AUTUMN = new Season("秋天", "凉爽");
  17.     public static final Season WINTER = new Season("冬天", "寒冷");
  18.     // 1.将构造器私有化,防止直接new传参
  19.     // 2.去掉set方法,防止属性被修改
  20.     // 3.在Season内部,直接创建固定的对象
  21.     // 4.固定的对象用final修饰
  22.     private Season(String name, String desc) {
  23.         this.name = name;
  24.         this.desc = desc;
  25.     }
  26.     public String getName() {
  27.         return name;
  28.     }
  29.     public String getDesc() {
  30.         return desc;
  31.     }
  32.     @Override
  33.     public String toString() {
  34.         return "Season{" +
  35.                 "name='" + name + '\'' +
  36.                 ", desc='" + desc + '\'' +
  37.                 '}';
  38.     }
  39. }
复制代码
(二)enum关键字实现枚举

   注意事项:
  

  • 当利用enum关键字开发一个枚举类时,默认会隐式继承Enum类,而且是一个final类;
  • 常量(参数列表),这里必须知道它调用的是哪个构造器;
  • 如果利用无参构造器创建枚举对象,则实参列表和小括号都可以省略,只写常量名即可;
  • 当有多个枚举对象时,利用 , 间隔,末了有一个分号末端;
  • 枚举对象必须放在枚举类的行首。
  1. enum Season2 {
  2.     // 定义四个对象
  3.     // public static final Season2 SPRING = new Season2("春天", "温暖");
  4.     // public static final Season2 SUMMER = new Season2("夏天", "炎热");
  5.     // public static final Season2 AUTUMN = new Season2("秋天", "凉爽");
  6.     // public static final Season2 WINTER = new Season2("冬天", "寒冷");
  7.     /**
  8.      * 如果使用enum来实现枚举类
  9.      * 1.使用关键字enum替代class
  10.      * 2.SPRING("春天", "温暖") => 常量名(实参列表)
  11.      * 替代public static final Season2 SPRING = new Season2("春天", "温暖");
  12.      * 3.如果有多个常量(对象),使用 , 号分割
  13.      * 4.如果使用enum实现枚举,定义的常量对象必须写在前面
  14.      */
  15.     SPRING("春天", "温暖"),
  16.     SUMMER("夏天", "炎热"),
  17.     AUTUMN("秋天", "凉爽"),
  18.     WINTER("冬天", "寒冷");
  19.     private String name;
  20.     private String desc;
  21.     Season2(String name, String desc) {
  22.         this.name = name;
  23.         this.desc = desc;
  24.     }
  25.     public String getName() {
  26.         return name;
  27.     }
  28.     public String getDesc() {
  29.         return desc;
  30.     }
  31.     @Override
  32.     public String toString() {
  33.         return "Season{" +
  34.                 "name='" + name + '\'' +
  35.                 ", desc='" + desc + '\'' +
  36.                 '}';
  37.     }
  38. }
复制代码
因为继承的Enum类中已经提供了toString()方法,所以定义枚举时,不需要写toString()方法

三、enum常用方法说明

 


1.toString 

  1. public static void main(String[] args) {
  2.     // 以Season2演示
  3.     Season2 winter = Season2.WINTER;
  4.     System.out.println(winter); // WINTER
  5.     // toString:Enum类已经重写过了,返回的是当前对象名,
  6.     // 子类可以重写该方法,用于返回对象的属性信息
  7.     System.out.println(Season2.SPRING.toString()); // SPRING
  8. }
复制代码
2.name

  1. // name:返回当前对象名(常量名),子类中不能重写
  2. System.out.println(winter.name()); // WINTER
复制代码
3.ordinal

  1. // ordinal:返回当前对象的位置号,默认从0开始编号
  2. System.out.println(winter.ordinal()); // 3
复制代码
4.value

  1. // values方法:返回当前枚举类中所有的常量
  2. Season2[] values = Season2.values();
  3. for (Season2 season : values) {
  4.     System.out.println(season);
  5. }
复制代码
5.valueOf

  1. // valueOf:将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常
  2. // 如果输入的值不在枚举中,会报错:IllegalArgumentException
  3. Season2 winter1 = Season2.valueOf("WINTER");
  4. System.out.println(winter1); // SUMMER
  5. System.out.println(winter1 == winter); // 返回true 说明是同一个对象
复制代码
6.compareTo

  1. // compareTo:比较两个枚举常量,比较的就是编号
  2. System.out.println(Season2.SPRING.compareTo(Season2.WINTER)); // 0 - 3 = -3
  3. // return self.ordinal - other.ordinal;
复制代码
四、Enum练习

   标题:声明Week吗,枚举类,此中包罗星期一至星期日,利用values返回全部的枚举数组,并遍历,输出星期几。 
  设置枚举类: 
  1. public enum Week {
  2.     MONDAY("星期一"),
  3.     TUESDAY("星期二"),
  4.     WEDNESDAY("星期三"),
  5.     THURSDAY("星期四"),
  6.     FRIDAY("星期五"),
  7.     SATURDAY("星期六"),
  8.     SUNDAY("星期日");
  9.     private String name;
  10.     Week(String name) { // 构造器
  11.         this.name = name;
  12.     }
  13.     @Override // 重写toString
  14.     public String toString() {
  15.         return name;
  16.     }
  17. }
复制代码
调用枚举类: 
  1. public class TestDemo1 {
  2.     public static void main(String[] args) {
  3.         Week[] values = Week.values();
  4.         System.out.println("==所有星期的信息如下==");
  5.         for (Week week : values) {
  6.             System.out.println(week);
  7.         }
  8.     }
  9. }
复制代码
五、enum利用细节——继承、接口

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

枚举类和普通类一样,可以实现接口。 
  1. public class EnumDetail {
  2.     public static void main(String[] args) {
  3.         Music.POP.playing(); // 播放音乐...
  4.     }
  5. }
  6. interface IPlaying {
  7.     public void playing();
  8. }
  9. enum Music implements IPlaying {
  10.     POP;
  11.     @Override
  12.     public void playing() {
  13.         System.out.println("播放音乐...");
  14.     }
  15. }
复制代码
六、注解

(一)注解的理解

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

        利用Annotation时要在前面增长@符号,并把该Annotation当成一个修饰符利用。用于修饰它支持的程序元素。
三个根本的Annotation:
1) @Override:限定某个方法,检测是否重写了父类方法,该注解只能用于方法。
   @Override源码:这里的 @interface 表示一个注解类。
  @Override只能修饰方法,不能修饰其它类、包、属性等等
  @Target(ElementType.METHOD)表示只能修饰方法
  @Target是修饰注解的注解,成为元注解。
  

  2) @Deprecated:用于表示某个程序元素(类, 方法等)已过期,过期不代表不能用,可以修饰方法、类、字段、包、参数等等。

3) @SuppressWarnings:抑制编译器警告。
利用前:

利用后:

   1.当我们不希望看到这些警告的时候,可以利用 SuppressWarnings注解来抑制警告信息
  2.在{""} 中,可以写入你希望抑制(不显示)警告信息
  3.可以指定的警告范例有:
  all,抑制全部警告
  boxing,抑制与封装/拆装作业相干的警告
  cast,抑制与强制转型作业相干的警告
  dep-ann,抑制与镌汰注释相干的警告
  deprecation,抑制与镌汰的相干警告
  fallthrough,抑制与switch陈述式中遗漏 break 相干的警告
  finally,抑制与未传回finally 区块相干的警告
  hiding,抑制与隐蔽变数的地域变数相干的警告
  incomplete-switch,抑制与 switch 陈述式(enum case)中遗漏项目相干的警告
  javadoc,抑制与 javadoc 相干的警告
  nls,抑制与非nls 字串文字相干的警告
  null,抑制与空值分析相干的警告
  rawtypes,抑制与利用raw范例相干的警告
  resource,抑制与利用 Closeable 范例的资源相干的警告
  restriction,抑制与利用不发起或禁止参照相干的警告
  serial,抑制与可序列化的类别遗漏serialVersionUID 栏位相干的警告
  static-access,抑制与静态存取不精确相干的警告
  static-method,抑制与可能宣告为 static 的方法相干的警告
  super,抑制与置换方法相干但不含super呼唤的警告
  synthetic-access,抑制与内部类别的存取未最佳化相干的警告
  sync-override,抑制因为置换同步方法而遗漏同步化的警告
  unchecked,抑制与未查抄的作业相干的警告
  unqualified-field-access,抑制与栏位存取不合格相干的警告
  unused,抑制与未用的程式码及停用的程式码相干的警告
  4.关于SuppressWarnings 作用范围是和你放置的位置相干
  5.比如 @SuppressWarnings放置在main方法,那么抑制警告的范围就是main通常我们可以放置具体的语句、方法、类。
  @SuppressWarnings 源码:
  (1) 放置的位置就是TYPE、FIELD、METHOD、PARAMETER、CONSTRUCTOR、LOCAL_VARIABLE
  (2)该注解类有数组 String[]values()设置一个数组比如{"rawtypes", "unchecked", "unused"}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表