枚举和注解

Posted Al_tair

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了枚举和注解相关的知识,希望对你有一定的参考价值。

枚举和注解

大家好呀!我是小笙!我学习了韩顺平老师的类和对象的知识,收获颇丰!现在来和大家分享笔记!

枚举和注解

概念:枚举是一种特殊的类,里面只包含一组有限的特定的对象

自定义枚举

// 案例:创建春夏秋冬四个季节
public class EnumClass01 
    public static void main(String[] args) 
        System.out.println(EnumDemo.WINTER);
        System.out.println(EnumDemo.SUMMER);
        System.out.println(EnumDemo.AUTUMN);
        System.out.println(EnumDemo.SPRING.toString());
    

/*
 * 自定义枚举 (枚举对象名通常为大写字母)
 * 1)构造器私有化 => 外部不能创建对象
 * 2)去掉setXxx方法 => 外部不能修改属性
 * 3)直接创建固定的对象 => 枚举的特定用法
 * 4)可以使用 final static 修饰符优化 => 防止类初始化的时候加载对象
 * 5)可以提供get方法,重写toString方法用来输出
 */
class EnumDemo
    private String seasonName;
    private String seasonFeature;

    public String getSeasonFeature() 
        return seasonFeature;
    

    public String getSeasonName() 
        return seasonName;
    

    //构造器
    private EnumDemo(String seasonName,String seasonFeature)
        this.seasonName = seasonName;
        this.seasonFeature = seasonFeature;
    
    // 创建枚举对象
    final static EnumDemo SPRING = new EnumDemo("春天","温暖");
    final static EnumDemo SUMMER = new EnumDemo("夏天","炎热");
    final static EnumDemo AUTUMN = new EnumDemo("秋天","凉爽");
    final static EnumDemo WINTER = new EnumDemo("冬天","寒冷");

    @Override
    public String toString() 
        return "["+getSeasonName()+"--->"+getSeasonFeature()+"]";
    

enum关键字实现枚举

public class EnumClass02 
    public static void main(String[] args) 
        System.out.println(Session.AUTUMN);
    

/*
 * 使用enum关键字来实现枚举
 * 1.当我们使用enum关键字开发一个枚举类时,默认会继承Enum类  java.lang.Enum<com.Al_tair.enum_.Session>
 * 反编译javap Session.class:
 * final class com.Al_tair.enum_.Session extends java.lang.Enum<com.Al_tair.enum_.Session> 
 *   public static final com.Al_tair.enum_.Session SPRING;
 *   public static final com.Al_tair.enum_.Session SUMMER;
 *   public static final com.Al_tair.enum_.Session AUTUMN;
 *   public static final com.Al_tair.enum_.Session WINTER;
 *   public static com.Al_tair.enum_.Session[] values();  // 隐藏
 *   public static com.Al_tair.enum_.Session valueOf(java.lang.String); 
 *   public java.lang.String getSeasonFeature();
 *   public java.lang.String getSeasonName();
 *   public java.lang.String toString();
 *   static ;
 * 
 */
enum Session
    /*
     * Enum枚举类
     * 1.使用关键字enum替代class
     * 2.格式: 形式常量名(实参列表)
     * 3.如果有多个常量对象,使用,号间隔
     * 4.如果使用enum枚举,要求将定义常量对象写在最前面
     * 5.  
     * 6.如果我们是使用无参构造器的时候,创建常量对象可以省略括号
     */
    SPRING("春天","温暖"),
    SUMMER("夏天","炎热"),
    AUTUMN("秋天","凉爽"),
    WINTER("冬天","寒冷");

    private String seasonName;
    private String seasonFeature;

    public String getSeasonFeature() 
        return seasonFeature;
    

    public String getSeasonName() 
        return seasonName;
    

    //构造器
    private Session(String seasonName,String seasonFeature)
        this.seasonName = seasonName;
        this.seasonFeature = seasonFeature;
    

    @Override
    public String toString() 
        return "["+getSeasonName()+"--->"+getSeasonFeature()+"]";
    

枚举常用方法

 // 测试枚举常用方法
enum Week
    MONDAY("星期一"),TUESDAY("星期二"),WEDNESDAY("星期三"),THURSDAY("星期四"),FRIDAY("星期五"),SATURDAY("星期六"),SUNDAY("星期日");

    private String WeekName;

    private Week(String WeekName) 
        this.WeekName = WeekName;
    


class testMethod
    public static void main(String[] args) 
        Week f = Week.FRIDAY;
        // name() 获得枚举常量对象名;优先使用toString()
        System.out.println(f.toString()); // FRIDAY
        System.out.println(f.toString() == f.name()); // true

        // ordinal() 得到当前枚举常量对象的次序 索引 0~
        System.out.println(f.ordinal()); // 4

        // values();  // 隐藏,Enum类中无法查看 本质: 包含所有常量对象的数组
        // 实现效果: MONDAY  TUESDAY  WEDNESDAY  THURSDAY  FRIDAY  SATURDAY  SUNDAY
        for (int i = 0; i < Week.values().length; i++) 
            System.out.print(Week.values()[i]+"  ");
        
        System.out.println();

        /* valueOf()方法 将字符串转换成枚举对象,要求字符串必须为已有的常量对象名,否则博报错
         * 源码如下
         *     public static <T extends Enum<T>> T valueOf(Class<T> enumType,String name) 
         *         T result = enumType.enumConstantDirectory().get(name);
         *         if (result != null) return result;
         *         if (name == null) throw new NullPointerException("Name is null");
         *         throw new IllegalArgumentException("No enum constant " +
         *                      enumType.getCanonicalName() + "." + name);
         *     
         */
        Week m = Week.valueOf("MONDAY");
        System.out.println(m.toString()); // MONDAY

        /*
         * compareTo()方法:比较两个枚举常量对象 == 比较编号
         *     public final int compareTo(E o) 
         *         Enum<?> other = (Enum<?>)o;
         *         Enum<E> self = this;
         *         if (self.getClass() != other.getClass() && // optimization
         *             self.getDeclaringClass() != other.getDeclaringClass())
         *             throw new ClassCastException();
         *         return self.ordinal - other.ordinal; // 比较编号
         *     
         */
        System.out.println(m.compareTo(f)); // -4
    

注解与元注解

注解

概念:注解是绑定到程序源代码元素的元数据,对运行代码的操作没有影响。

三个基本注解: @Deprecated @Override @SuppressWarnings

public class Deprecated_ 
    public static void  main(String[]args)
        A a = new A();
    

/*
 * @Deprecated
 * 特征:有划线
 * 1.该注解修饰某个元素,表示该元素已经过时
 * 2.即不推荐使用,但可以用
 *
 * @Override
 * 限定于某个方法,是重写父类的方法
 *
 * @SuppressWarnings
 * 抑制编译器警告 
 * 格式:@SuppressWarning("","",""...);
 * 例子:@SuppressWarning("all"); 抑制所有警告
 * 通常放在方法和类上
 * @SuppressWarning 中的属性介绍以及属性说明
 * 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,抑制与未用的程式码及停用的程式码相关的警告
 */
@Deprecated
class A
    public void fly()

class B extends A
    @Override
    public void fly()

元注解(了解)

概念: 用来修饰注解(如@Override)

Retention 指定注解的作用范围,三种SOURCE,CLASS,RUNTIME

  • RetentionPolicy.SOURCE 该注解经过编译后被丢弃
  • RetentionPolicy.CLASS 该注解在解释之后被丢弃
  • RetentionPolicy.RUNTIME 该注解会被保存到JVM虚拟机中

Target 指定注解可以在哪些地方使用

Documented 指定该注解是否会在javadoc体现

Inherited 子类会继承父类的注解

// @Override的源码案例分析
@Target(ElementType.METHOD) // 方法中使用
@Retention(RetentionPolicy.SOURCE)  // 该注解主要是用于编译,所以在编译之后丢弃
public @interface Override  // @interface 不是接口,代表注解类(jdk5.0之后添加)

以上是关于枚举和注解的主要内容,如果未能解决你的问题,请参考以下文章

java里的自定义注解类型 有啥用?

忽略警告注解@SuppressWarnings关键字含义

枚举和注解

第11章 枚举和注解

Java_枚举类和注解

枚举和注解