枚举&注解

枚举:自定义枚举类

            使用Enum关键字定义的枚举类 

注解:jdk内置的基本注解类型(3个) 

           自定义注解类型

           对注解进行注解(元注解4个)

          利用反射获取注解信息(反射部分涉及)

自定义枚举类:

TestSeason 
package com.aff.Gen;
//自定义的枚举类
public class TestSeason {
    public static void main(String[] args) {
        Season spring = Season.SPRING;
        System.out.println(spring);
        spring.show();
        System.out.println(spring.getSeasonName());
    }
}

// 枚举类
class Season {
    // 1. 提供类的属性,声明private final
    private final String seasonName;
    private final String seasonDesc;

    // 2.声明为final的属性,在构造器中初始化
    public Season(String seasonName, String seasonDesc) {
        super();
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    // 3.通过公共的方法来调用属性
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

    // 4.创建枚举类的对象 president
    public static final Season SPRING = new Season("spring", "春暖花开");
    public static final Season SUMMER = new Season("Summer", "夏日炎炎");
    public static final Season AUTUMN = new Season("Autumn", "秋高气爽");
    public static final Season WINTER = new Season("Winter", "白雪皑皑");

    @Override
    public String toString() {
        return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]";
    }

    public void show() {
        System.out.println("这是一个季节");
    }
}

使用Enum关键字定义的枚举类:

TestSeasonEnum

package com.aff.Gen;

//使用Enum关键字定义的枚举类
/*      常用的方法: values()  :以数组的形式返回整个枚举类的对象。
                              valuesOf(String name) : 传入字符串,返回枚举类的对象 
        如何让枚举类实现接口: 可以让不同枚举类的对象调用被重写的抽象方法,执行的效果不同
                           相当于让每一个对象从重写抽象方法;
*/
public class TestSeasonEnum {
    public static void main(String[] args) {
        Season1 spring = Season1.SPRING;
        System.out.println(spring);//Season1 [seasonName=spring, seasonDesc=春暖花开]
        spring.show();//c春天在那
        System.out.println(spring.getSeasonName());//spring
        
        //values()
        Season1[]  season =  Season1.values();
        for(int i = 0;i<season.length;i++){
                System.out.println(season[i]);            
        }
        
        //valuesOf(String  name); 要求传入的形参name是枚举类的对象的名字
        //否则,报 java.lang.IllegalArgumentException
        String str = "SPRING";
        Season1 s = Season1.valueOf(str);
        System.out.println(s);//Season1 [seasonName=spring, seasonDesc=春暖花开]
        s.show();//c春天在那
    
    //枚举类:线程的state 
    Thread.State[] state  =      Thread.State.values();
    for(int  i = 0;i<state.length;i++){
        System.out.println(state[i]);
        }
    }
}
interface Info{
    void show();
}

// 枚举类
enum Season1  implements Info{
    SPRING ("spring", "春暖花开"){
        public void show() {
            System.out.println("c春天在那");
        }
    },
    SUMMER ("Summer", "夏日炎炎"){
        public void show() {
            System.out.println("这是一个夏节");
        }
    },
    AUTUMN ("Autumn", "秋高气爽"){
        public void show() {
            System.out.println("这是一个秋节");
        }
    },
    WINTER ("Winter", "白雪皑皑"){
        public void show() {
            System.out.println("这是一个冬节");
        }
    };
    
    private final String seasonName;
    private final String seasonDesc;

    private Season1(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

    @Override
    public String toString() {
        return "Season1 [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]";
    }

/*    public void show() {
        System.out.println("这是一个季节");
    }*/
}

注解:

package com.aff.Gen;
import java.util.ArrayList;
import java.util.List;
/*
注解
   1.jdk提供的常用的注解
        @Override:限定重写父类方法,该注释只能用于方法
        @Deprecated:用于表示某个程序 (类,方法等) 已过时
        @SuppressWarnings:抑制编译器警告
   2.如何自定义一个注解
   3.元注解
        1>@Retention:
               |----只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 可以保留多长时间, 
                    @Rentention 包含一个 RetentionPolicy 类型的成员变量
                    使用 @Rentention 时必须为该 value 成员变量指定值:
                               |---- RetentionPolicy.SOURCE: 编译器直接丢弃这种策略的注释
                               |---- RetentionPolicy.CLASS: 编译器将把注释记录在 class 文件中. 
                                     当运行 Java 程序时, JVM 不会保留注解。 这是默认值
                               |---- RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中.
                                     当运行 Java 程序时, JVM 会保留注释. 程序可以通过反射获取该注释
        2>@Target
               |---- 用于修饰 Annotation 定义, 用于指定被修饰的 Annotation 能用于修饰哪些程序元素. 
                     @Target 也包含一个名为 value 的成员变量.
        3>@Documented
               |---- 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.
                     定义为Documented的注解必须设置Retention值为RUNTIME。

        4>@Inherited
               |---- 被它修饰的 Annotation 将具有继承性.
如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解 实际应用中,使用较少
*/ public class TestAnnotation { public static void main(String[] args) { Person p = new Student(); p.walk(); @SuppressWarnings({ "rawtypes", "unused" }) List list = new ArrayList(); } } @MyAnnotation("afangfang") class Student extends Person { @Override public void walk() { System.out.println("学生走轮"); } @Override public void eat() { System.out.println("学生吃饭"); } } @Deprecated class Person { String name; int age; public Person() { super(); } public Person(String name, int age) { this.name = name; this.age = age; } public void walk() { System.out.println("走轮"); } public void eat() { System.out.println("吃饭"); } }

自定义注解:

MyAnnotation

package com.aff.Gen;

//自定义的注解
public @interface MyAnnotation {
    String value() default "hello";

}
All that work will definitely pay off
原文地址:https://www.cnblogs.com/afangfang/p/12594551.html