Enum
1.使用oublic static final表示的常量描述较为繁琐,使用enum关键字来定义枚举类型取代常量,枚举类型是从Jva5开始增加的一种引用数据类型。
2.枚举值就是当前类的类型,也就是指向本类的对象,默认使用public static final关键字共同修饰,因此采用枚举类型.的方式调用。
3.枚举类可以自定义构造方法,但是构造方法的修饰符必须是private,默认也是私有的。
package afternoon;
//枚举的基本概念
//一年中的所有季节、人的性别
//一一枚举
//明确的几个固定值
public class Direction {
private final String desc;//用于描述方向字符串的成员变量
//+static 为了外面访问
//都修饰成常量了 被迫大写
public static final Direction UP = new Direction("向上");
public static final Direction DOWN = new Direction("向下");
public static final Direction LEFT = new Direction("向左");
public static final Direction RIGHT = new Direction("向右");
//通过构造方法实现字符串的初始化
private Direction(String desc){
this.desc = desc;
}
public String getDesc() {
return desc;
}
}
package afternoon;
public enum DirectionEnum {
UP("向上"),DOWN("向下"),LEFT("向左"),RIGHT("向右");
private final String desc;
private DirectionEnum(String desc) {
this.desc = desc;
}
public String getDesc() {
return desc;
}
}
package afternoon;
public class DirectionTest {
public static void main(String[] args) {
//生命direction类型的引用指向该类型的对象并打印特征
// Direction d1 = new Direction("向上");
// Direction d2 = new Direction("向下");
// Direction d3 = new Direction("向左");
// Direction d4 = new Direction("向右");
System.out.println("获取到的字符串是:"+Direction.UP.getDesc());
System.out.println("获取到的字符串是:"+Direction.DOWN);
System.out.println("获取到的字符串是:"+Direction.LEFT);
System.out.println("获取到的字符串是:"+Direction.RIGHT);
}
}
package afternoon;
public class DirectionUseTest {
//自定义静态方法实现根据参数指定的字符串内容打印具体的方向信息
public static void test1(String str){
switch (str){
case"向上":
System.out.println("抬头望明月!");break;
case"向下":
System.out.println("低头思故乡!");break;
case"向左":
System.out.println("左牵黄!");break;
case"向右":
System.out.println("右擎苍!");break;
default:
System.out.println("没有这样的方法!");
}
};
public static void test2(DirectionEnum de){
switch (de){
case UP:
System.out.println("抬头望明月!");break;
case DOWN:
System.out.println("低头思故乡!");break;
case LEFT:
System.out.println("左牵黄!");break;
case RIGHT:
System.out.println("右擎苍!");break;
default:
System.out.println("没有这样的方法!");
}
};
public static void main(String[] args) {
DirectionUseTest.test1(Direction.UP.getDesc());
DirectionUseTest.test2(DirectionEnum.DOWN);
}
}
所有的枚举类都继承自java.lang.Enum类
常用方法如下:
public class DirectionEnumTest {
public static void main(String[] args) {
//获取directionEnum类型中的所有枚举对象
DirectionEnum[] directionEnums = DirectionEnum.values();
for(int i=0;i< directionEnums.length;i++){
//打印名称
System.out.println(directionEnums[i].toString());
//打印索引位置
System.out.println(directionEnums[i].ordinal());
}
//根据参数指定的字符串得到枚举类型的对象
//DirectionEnum de = DirectionEnum.valueOf("向前");
//Exception in thread "main" java.lang.IllegalArgumentException:
DirectionEnum de = DirectionEnum.valueOf("UP");
//要求字符串必须在枚举类型中存在
//System.out.println("转换出来的枚举对象名称是"+de.toString());
//当时用打印引用变量时 会自动调用tostring方法()估计重写了
System.out.println("转换出来的枚举对象名称是"+de);
for(int i=0;i<directionEnums.length; i++)
{
System.out.println("调用对象与数组中对象比较多先后顺序结果"+de.compareTo(directionEnums[i]));
}
}
}
调用对象-数组对象
1.枚举类继承接口 重写其方法:
@Override
public void show() {
System.out.println("现在可以在枚举类里实现接口中抽象方法的重写了");
}
test类中调用
//思考能不能通过匿名类调用
for(int i = 0 ;i<directionEnums.length;i++){
directionEnums[i].show();
}
2.每个枚举类都重写:匿名内部类 接口/父类类型 引用变量名 = new 接口/父类类型(){方法的重写}
这里枚举类型是简化写法
完整写法 public static final Direction UP = new Direction("向上"){方法的重写};
UP("向上"){
@Override
public void show() {
System.out.println("贪吃蛇向上移动了一下");
}
},DOWN("向下") {
@Override
public void show() {
System.out.println("贪吃蛇向下移动了一下");
}
},LEFT("向左") {
@Override
public void show() {
System.out.println("贪吃蛇向左移动了一下");
}
},RIGHT("向右") {
@Override
public void show() {
System.out.println("贪吃蛇向右移动了一下");
}
};
注释
public @interface MyAnnotation {
//注解体中只有成员变量没有成员方法,而注解的成员变量以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型
public String value();//声明一个string 类型的成员变量 名字为value
public String value2()default"默认值";
}
只有一个需要初始化的值时 可以直接在注释后"hello"初始化
@MyAnnotation(value = "hello", value2 = "world")//表示将标签MyAnnotationt贴在person代码上
public class Person {
private String name;
private int age;
}
元注释
1.@Retention() 保持 描述生命周期
RetentionPolicy.SOURCE注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
RetentionPolicy.CLASS注解只被保留到编译进行的时候,它并不会被加载到VM中,默认方式Retention Policy.RUNTIME注解可以保留到程序运行的时候,它会被加载进入到JVM中,所以在程序运行时可以获取到它
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnnotation {}
2.@Documented
3.@Target
表示下面的注解用于什么类型的修饰
@Target({ElementType.TYPE,ElementType.CONSTRUCTOR,ElementType.FIELD})
@MyAnnotation("hello")
private String name;
4.@Inherited
指示批注类型是自动继承的。如果在注释类型声明中存在继承的元注释,并且用户在类声明上查询注释类型,并且类声明对该类没有注释,那么该类的超类将自动被查询到注释类型。这个过程将被重复,直到找到这个类型的注释,或者到达类层次结构(对象)的顶端。如果没有超类具有此类的注释,那么查询将表明该类没有此类注释
类继承关系中@Inherited的作用
类继承关系中,子类会继承父类使用的注解中被@Inherited修饰的注解
接口继承关系中@Inherited的作用
接口继承关系中,子接口不会继承父接口中的任何注解,不管父接口中使用的注解有没有被@Inherited修饰
类实现接口关系中@Inherited的作用
类实现接口时不会继承任何接口中定义的注解
5.@Repeatable
表示该注解可多次使用
6.常见的预制注解
@Deprecatedz方法过时 尽量不使用 会生效
@SuppressWarnings抑制编译器警告