JAVA基础-高级编程-枚举&注解

枚举

/**
 * 枚举类的使用
 *      枚举类的理解:当一个类的对象是有限个确定的时候
 *      当需要定义一组常量时,强烈建议使用枚举类
 *      如果枚举类中只有一个对象,则可以作为单例模式的实现方式
 * 如何定义枚举类
 *      方式一:jdk5.0之前自定义枚举类
 *      方式二:enum关键字定义
 * Enum类常用方法:
 *      toString():默认返回枚举对象的对象名
 *      valueOf(String s):
 *      values():
 *      
 *      
 * 使用enum关键字定义的枚举类实现接口的情况
 *      情况一:实现接口,在enum类中重写接口方法
 *      情况二:
 * @author from z
 * @create 2021-02-04 22:36
 */
public class SeasonTest {
    public static void main(String[] args) {
        Season spring = Season.SPRING;
        System.out.println(spring);

        //values()方法,返回所有枚举对象
        Season1[] values = Season1.values();
        for (int i = 0; i < values.length; i++) {
            System.out.println(values[i]);
        }
        //valueOf()返回指定对象名的枚举类对象,如果没有则抛出异常
        Season1 spring1 = Season1.valueOf("SPRING");
        spring1.show();
    }
}
//自定义枚举类
class Season{
    //1.声明Season对象的属性
    private final String seasonName;
    private final String seasonDesc;
    //2.私有化类的构造器
    private Season(String seasonName,String seasonDesc){
        this.seasonDesc=seasonDesc;
        this.seasonName=seasonName;
    }
    //3.提供当前枚举类的多个对象
    public static final Season SPRING=new Season("春天","春暖花开");
    public static final Season SUMMER=new Season("夏天","夏日炎炎");
    public static final Season AUTUMN=new Season("秋天","秋高气爽");
    public static final Season WINTER=new Season("冬天","冰天雪地");

    //4.其他诉求:获取枚举类对象的属性
    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }

    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }
}
interface Info{
    void show();
}
//jdk5.0之后enum定义枚举类
//enum的父类为Enum
enum Season1 implements Info{
    //1.提供当前枚举类的对象,多个对象之间用,隔开;必须放在构造器和其他属性方法之前
    
    SPRING("春天","出暖花开"){
        @Override
        public void show() {
            /**
            如果不是enum类重写接口方法,则需要每一个对象都重写接口方法
             */
        }
    },
    WINTER("夏天","夏日炎炎"){
        @Override
        public void show() {
            
        }
    },
    AUTUMN("秋天","秋高气爽"){
        @Override
        public void show() {
            
        }
    },
    SUMMER("冬天","冰天雪地"){
        @Override
        public void show() {
            
        }
    };
    //声明当前类的属性
    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;
    }
    //枚举类默认toString()输出枚举对象的对象名
    @Override
    public String toString() {
        return "Season1{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }

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

注解

Annotation

/**
 * 注解的使用:
 *      1.理解Annotation
 *      jdk5.0新增
 *
 * 三个基本注解
 *      @Override重写
 *      @Deprecated过时
 *      @SuppressWarnings抑制编译器警告
 *
 * 自定义注解
 *      @interface  声明注解 参照suppresswarnings
 *      Annotation的成员变量定义中以无参数方法的形式来声明。其方法名和返回值类型是成员的名字和类型
 *      类型可以是八种基本类型 String enum Annotation Class类型,和以上所有类型的数组
 *      内部定义成员通常使用value表示
 *      可以指定内部成员的默认值,使用default
 *      如果注解没有成员表示标识作用
 *
 *      如果注解有成员,在使用注解时,需要给成员赋值 @Annotation(value="")
 *      自定义注解必须配上注解的信息处理流程(使用反射)才有意义
 *      自定义注解通常都会指明两个元注解:retention  target
 * jdk 提供的四种元注解:对现有注解进行解释说明的注解
 *      Retention:指定修饰的annotation的生命周期 source class(默认) runtime
 *                  只有声明为runtime才能通过反射获得
 *      Target:用于指定被修饰的annotation可以修饰哪些元素
 *      ********出现频率低
 *      Documented:表示所修饰的注解被javadoc解析时被保存下来
 *      Inherited:被修饰的注解具有继承性--------如果Person被元注解Inherited修饰的注解注解了,则person的子类也会有同样的注解
 *      
 * 通过反射获取注解信息 ---反射文章讲解
 *
 * jdk8.0可重复注解  @Repeatable
 * 
 * 
 * @author from z
 * @create 2021-02-05 16:41
 */
@Repeatable(AnnotationTests.class)
@Target({ElementType.TYPE})//只能修饰类枚举接口
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationTest {
    String value() default "hello";//可以指定默认值
    
}


@AnnotationTest(value = "hi")
@AnnotationTest(value = "hi")
//jdk8.0之前可重复注解写法@AnnotationTests({@AnnotationTest(value = "hi"),@AnnotationTest(value = "hi")})
class Person{

}
@Target({ElementType.TYPE})//只能修饰类枚举接口
@Retention(RetentionPolicy.RUNTIME)
@interface AnnotationTests{
    AnnotationTest[] value();
}

你可能感兴趣的:(java)