一、枚举类

1.概述:即一个类中只能有有限个对象,若只有一个对象,则可以作为单例模式的一种实现。

2.自定义枚举类(JDK1.5以前这么做)

//枚举类
class Season{
    //1.提供类的属性,声明为private final
    private final String seasonName;
    private final String seasonDesc;
    //2.声明为final的属性,在私有构造器中初始化
    private Season(String seasonName,String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
    //3.通过公共的方法来调用属性
    public String getSeasonName(){
        return seasonName;
    }
    public String getSeasonDesc(){
        return seasonDesc;
    }
    //4.创建枚举类对象,声明为public static final
    public static final Season SPRING = new Season("spring","春暖花开");
    public static final Season SUMMER = new Season("summer","夏日炎炎");
    public static final Season AUTUMM = new Season("autumm","秋风飒爽");
    public static final Season WINTER = new Season("winter","白雪皑皑");
    
    public void show(){
        System.out.println(seasonName+"的季节是"+seasonDesc+"的!");
    }
}

public class Test{
    public static void main(String[] args){
        Season spring = Season.SPRING;
        spring.show();//输出spring的季节是春暖花开的!
    }
}

3.用enum关键字定义枚举类(JDK1.5后这么做)

(1)常用的方法

A:values():返回一个存放所有枚举对象的数组

B:valueOf(String name):返回指定名字的枚举对象

(2)枚举类实现接口:可以让不同的枚举类对象调用被重写的抽象方法。执行的效果不同(相当于让每个对象都去重写抽象方法)

(3)代码示例

//枚举类
enum Season implements info{
    //枚举类对象要放在类的最前面,public static final等可以省略,每个对象用,分开,最后用;结尾
    SPRING("spring","春暖花开"){
        public void show(){//重写show()方法
            System.out.println("春天在哪里");
        }
    },
    SUMMER("summer","夏日炎炎"){
        public void show(){//重写show()方法
            System.out.println("生如夏花");
        }
    },
    AUTUMM("autumm","秋风飒爽"){
        public void show(){//重写show()方法
            System.out.println("秋天是分手的季节");
        }
    },
    WINTER("winter","白雪皑皑"){
        public void show(){//重写show()方法
            System.out.println("冬天里的一把火");
        }
    };
    
    private final String seasonName;
    private final String seasonDesc;
    
    private Season(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 "["+seasonName+","+seasonDesc+"]";
    }
    
}

interface info{
    void show();
}
public class Test{
    public static void main(String[] args){
        //1.values()方法
        Season[] seasons = Season.values();
        for(int i = 0;i < seasons.length;i++){
            System.out.println(seasons[i]);//遍历输出[spring,春暖花开],[summer,夏日炎炎]...
        }
        //2.valueOf(String name)方法
        String str = "AUTUMM";
        Season sea = Season.valueOf(str);
        System.out.println(sea);//输出[autumm,秋风飒爽]
        
        sea.show();//输出秋天是分手的季节
    }
}

二、注解Annotation

1.概述

  从JDK5.0开始,Java增加了对元数据(MetaData)的支持,也就是Annotation(注解)。Annotation其实就是代码里的特殊标记,这些标记在编译、类加载、运行时被读取,

并执行相应处理。通过使用Annotation,可以在不改变原有逻辑的情况下,在源文件嵌入一些补充信息。

  Annotation 可以像修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明,这些信息被保存在Annotation的“name=value”对中。

  Annotation能被用来为程序元素(类,方法,成员变量等)设置元数据。

2.JDK内置的3个基本注解类型

(1)@Override:限定重写父类方法,该注释只能用于方法

(2)@Deprecated:用于表示某个程序元素(类,方法等)已经过时,但还是可以用

(3)@SuppressWarnings:抑制编译器警告

3.自定义注解

public @interface MyAnnotation{
    String value() default "hello";
    }

@MyAnnotation(value = "java_learn")//使用
public class Test{
    
}

4.元注解:专门用于修饰其他注解的注解

(1)@Retention:用于修饰一个Annotation定义,指定该Annotation的生命周期,通过对RetentionPolicy类型的成员变量value赋值实现。

A:@Retention(RetentionPolicy.SOURCE):编译器直接抛弃这种注解

B:@Retention(RetentionPolicy.CLASS):编译器将把注释记录在class文件中,当运行Java程序时,JVM不会保留注解。这是默认的值

C:@Retention(RetentionPolicy.RUNTIME):编译器将把注释记录在class文件中,当运行Java程序时,JVM会保留注解,程序可以通过反射获取该注解。

(2)@Target:用于指定被修饰的Annotation能用于修饰哪些程序元素。也拥有一个成员变量value。

@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE,FIELD,METHOD,PAPAMETER,CONSTRUCTOR,LOCAL_VARIABLE})//TYPE指class,interface;FILED指Field
public @interface MyAnnotation{
    String value() default "hello";
    }

(3)@Documented:被修饰的Annotation将能被javadoc工具提取成文档,使用的前提是Retention必须为RUNTIME。

(4)@Inherited:被修饰的Annotation将具有继承性。如果某个类使用了被@Inherited修饰的Annotation,则其子类自动具有该注解。