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 修饰
enum常用方法举例
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