java学习----枚举和注解

java学习----枚举和注解

枚举

自定义类实现枚举

步骤:
1.不需要提供setxxx方法,因为枚举对象的属性只需读。

2.对枚举对象使用 final + static修饰,实现底层优化。

3.枚举对象名通常全部使用大写,这是一个命名规范。

4.构造器私有化,但是对象向外暴露。

package Enum;
public class DefineMyself {
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
        System.out.println(Season.SUMMER);
    }
}
class Season{
    private String name ;
    private String weather;
    public static final Season SPRING = new Season("春天","温暖");
    public static final Season SUMMER = new Season("夏天","炎热");
    private Season(String name, String weather) {
        this.name = name;
        this.weather = weather;
    }
    public String getName() {
        return name;
    }
    public String getWeather() {
        return weather;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", weather='" + weather + '\'' +
                '}';
    }
}

使用enum关键字实现枚举

1.但我们使用enum关键字来创建一个枚举类时,默认会继承Enum类,同时该类使用了final修饰。

2.传统的 public static final Season SPRING = new Season(“春天”,“温暖”); 变成了SPRING(“春天”,“温暖”),我们要注意它调用的是哪一个构造器。

3.如果调用的是无参构造器创建的枚举对象,则实参列表和小括号都可以省略。

枚举对象必须放在枚举类的首行。

package Enum;
public class DefineMyself {
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
        System.out.println(Season.SUMMER);
    }
}
enum Season{
    SPRING("春天","温暖"),
    SUMMER("夏天","炎热");
    public String name ;
    public String weather;
    private Season(String name, String weather) {
        this.name = name;
        this.weather = weather;
    }
    public String getName() {
        return name;
    }
    public String getWeather() {
        return weather;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", weather='" + weather + '\'' +
                '}';
    }
}

注意使用enum关键字创建枚举类时对象依然有 static 和 final 修饰
java学习----枚举和注解

enum常用方法举例

java学习----枚举和注解
values : 返回当前枚举类中的所有常量。返回的是一个数组。

class Untitled {
	public static void main(String[] args) {
		Season season = Season.SPRING;
		System.out.println(season.name());
		System.out.println(season.ordinal());//输出0
		Season[] seasons = Season.values();
		for(Season s1: seasons){
			System.out.println(s1);//输出SPRING和SUMMER
		}
		Season value = Season.valueOf("SPRING");
		System.out.println(value);//输出SPRING
		System.out.println(season.compareTo(Season.SUMMER));//0-1=-1,输出-1
	}
}
enum Season{
	SPRING("春天","温暖"),SUMMER("夏天","炎热");
	private String name;
	private String weather;
	private Season(String name,String weather){
		this.name = name;
		this.weather = weather;
	}
}

使用细节

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

2.枚举类和普通类一样,可以实现接口。

enum 类名 implements 接口1,接口2{};

注解

注解的理解

注解(Annotation)也被称为元数据,用于修饰解释,包,类,方法,属性,构造器,局部变量的数据信息。

和注释一样,不影响程序的逻辑,但注解可以被编译和运行,相当于嵌入在代码中的补充信息。

使用Annotation时要在前面加@符号,并把Annotation当成修饰符使用,用于修饰它支持的程序元素。

三个基本的Annotation:
1.@Override :限定某个方法,是重写父类方法,该注解只能用于方法。

说明:如果使用了@Override,则接下来的方法必须重写父类方法,如果没有,那么编译器会报错。

//@Override的源码
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

注意:@interface表示一个注解类,不是接口。
@Target是修饰注解的注解,称为元注解。

2.@Deprecated : 用于表示某个程序元素(类,方法等)已经过时。

package annotation_;

public class deprecated_ {
    public static void main(String[] args) {
        //A上出现一个横线,表示过时,不推荐使用,但是仍可以使用
        A a = new A();
    }
}
@Deprecated
class A{
    public int n1;
}

@Deprecated可以用作JDK新旧版本的兼容和过渡使用。

3.@SuppressWarnings : 抑制编译器警告。

package annotation_;
import java.util.ArrayList;
import java.util.List;
@SuppressWarnings({"all"})
public class SuppressWarnings_ {
    public static void main(String[] args) {
        int i = 0;
        List list = new ArrayList();
        list.add("jack");
    }
}
//作用的类型TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE
//可以传入一个数组

/*
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}
 */

元注解

JDK 的元 Annotation 用于修饰其他 Annotation,可以增强对源代码的理解

元注解的种类:

(1) Retention //指定注解的作用范围,三种 SOURCE,CLASS,RUNTIME
(2) Target // 指定注解可以在哪些地方使用
(3) Documented //指定该注解是否会在 javadoc 体现
(4) Inherited //子类会继承父类注解

@Retention 注解

说明只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 可以保留多长时间, @Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用 @Rentention 时必须为该 value 成员变量指定值:

@Retention 的三种值
(1) RetentionPolicy.SOURCE: 编译器使用后,直接丢弃这种策略的注释

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

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

@Documented

用于指定被元注解修饰的注解类将被javadoc工具提取成文档,即在生成文档时,可以看到该注解。

定义Documented的注解的Rentention必须设置为RUNTIME

上一篇:获取开源天气信息的API


下一篇:5-3