枚举类型
-
举例: 其中枚举的值必须放在代码的最前面
package com.lagou.meiju; /* 编程实现所有方向的枚举,上下左右。枚举类型要求所有枚举值必须放在枚举类型的最前面 */ public enum DirectionEnum { UP("向上"),DAWN("向下"),LEFT("向左"),RIGHT("向右"); private final String desc ; // 通过构造方法实现成员变量的初始化,更加灵活 // 私有化构造方法,此时该方法只能在本类的内部使用 private DirectionEnum(String desc){ this.desc=desc; } // 通过公有的get方法可以在本类的外部访问该类的成员变量 public String getDesc() { return desc; } }
-
枚举类中不可以有继承。因为枚举类本身就是继承了enum的。Java不支持多继承。所以自然就不可以继承。
-
枚举类可以实现接口,所以需要重写抽象方法,而重写抽象方法的方式有俩种:重写一个或者每个对象都重写。
-
重写一个和普通的重写抽象方法是一样的。这里不展示了
-
每个对象都重写的代码如下,也就是使用匿名内部类的方法。
匿名内部类的语法格式:接口/父类类型 引用变量名 = new 接口/父类类型(){方法的重写}
UP("向上"){ @Override public void show() { } },DAWN("向下") { @Override public void show() { } },LEFT("向左") { @Override public void show() { } },RIGHT("向右") { @Override public void show() { } };
-
-
所有的枚举类都继承自java.lang.Enum类,常用的方法如下
其中T为当前枚举类型
方法名称 | 方法功能 |
---|---|
String toString() | 返回当前枚举类对象的名称 |
int ordinal() | 获取枚举对象再枚举类中的索引位置 |
static T valueOf(String str) | 将参数指定的字符串名称转换为当前枚举类的对象 |
int compareTo(E o) | 比较俩个枚举对象再定义的时候的顺序 |
static T[] values() | 返回当前枚举类中的所有对象 |
注解的基本概念
-
注解: 又叫做标注,是从java5开始增加的一种引用数据类型
-
注解本省是代码中的特殊标记,通过这些标记可以在编译,类加载以及运行时执行指定的处理。
-
注解的语法格式:
-
访问修饰符 @ interface 注解名称{
注解成员;
}
-
自定义注解自动继承 java.lang.annotation.Annotation接口
-
-
通过@注解名称 的方式往其他地方贴注解标记。
-
注解中只有成员变量没有成员方法,而注解的成员变量以”无形参的方法“形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。
-
如果注解中只有一个参数成员,建议使用参数名为value,而类型只能是八种基本数据类型,String类型,Class类型Enum类型以及Annotation类型。
package com.lagou.meiju;
//自定义一个注解
//如果一个注解中没有任何成员,则这样的注解叫做标记注解或者标识注解。
public @interface MyAnnotation {
public String value()default "默认值"; //在注解里面这一行代码叫做声明一个String类型的变量名字叫做value
public String value2()default "默认值2";//添加一个默认值,后面的注解就不一定需要传参了
}
package com.lagou.meiju;
//表示将标签Annotation贴在person类的代码中,使用注解时采用 成员参数名=成员参数值
@MyAnnotation(value = "hellow",value2 = "hellow world")
public class Person {
private String name;
private String age;
}
元注解的概念
-
概念: 元注解是可以i注解到注解上的注解,或者说元注解是一种基本注解,但是他能够应用到其他的注解上面
-
类型:元注解主要有: @ Retention @Documented @Target @Inherited @Repeatable
-
@ Retention 应用到一个注解上用于说明该注解的生命周期,取值如下
- RetentionPolicy.SOURCE 注解旨在源码阶段保留,在编译器进行编译时他将被丢弃忽视
- RetentionPolicy.CLASS注解只被保留到编译进行的时候,它不会被加载到JVM中,默认方式。
- RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被假造到JVM中,所以在程序运行的时候可以获取到她们。
-
元注解@Documented
- 使用javadoc工具可以从程序源代码中抽取类方法成员等注释形成一个和源代码配套的API帮助文档,而该工具抽取的时候默认不包括注解内容。
-
元注解@Target 用于指定被修饰的注解能够用于哪些元素的修饰,取值如下:
取值 作用 ElementType.ANNOTATION_TYPE 可以给一个注解进行注解表示我们所定义的注解只能用来修饰注解 ElementType.CONSTRUCTOR 可以给构造方法进行注解,表示我们所修饰的注解可以用来给构造方法进行注解。 ElementType.FIELD 可以给属性进行注解 ElementType.LOCAL_VARIABLE 可以给局部变量进行注解 ElementType.METHOD 可以给方法进行注解 ElementType.PACKAGE 可以给一个报进行注解 ElementType.PARAMETER 可以给一个方法内的参数进行注解 ElementType.TYPE 可以给类型进行注解,比如类,接口,枚举 -
元注解 @Inherited
- 不是说注解本身可以被继承,而是说如果一个超类被该注解标记过的注解进行注解的时候,如果子类没有被任何注解应用时,子类就继承超类的注解。
package com.lagou.meiju; //自定义一个注解 //如果一个注解中没有任何成员,则这样的注解叫做标记注解或者标识注解。 import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Documented //表示下面的注解信息可以被javadoc公户提取到API文档中 //@Target(ElementType.TYPE) //表示下面的注解信息可以用于类型的修饰 @Target({ElementType.ANNOTATION_TYPE,ElementType.FIELD,ElementType.CONSTRUCTOR,ElementType.TYPE})//如果想要下面的注解可以作用于多种情况,可以传输一个数组。 @Inherited //表示下面的注解所修饰的类中的注解使用可以被子类继承。也就是说子类可以继承父类的注解。 public @interface MyAnnotation { public String value()default "默认值"; //在注解里面这一行代码叫做声明一个String类型的变量名字叫做value public String value2()default "默认值2"; } package com.lagou.meiju; //表示将标签Annotation贴在person类的代码中,使用注解时采用 成员参数名=成员参数值 @MyAnnotation(value = "hellow",value2 = "hellow world") public class Person { /** * name是用于描述姓名的成员变量 */ private String name; /** * age是用于描述年龄的成员变量 */ private String age; /** * person类的无参构造 */ @MyAnnotation(value2 = "..") public Person() { } /** * Person类的有参构造 */ public Person(String name, String age) { this.name = name; this.age = age; } /** * 得到名称 */ public String getName() { return name; } public void setName(String name) { this.name = name; } /** * 得到年龄 */ public String getAge() { return age; } public void setAge(String age) { this.age = age; } } package com.lagou.meiju; //Student类继承了Person类的注解。 public class Student extends Person { }
-
元注解 @Repeatable
-
@Repeatable 表示自然可重复的含义,从java8开始增加的新特性。
-
在java8以前,如果想要对一个类进行多个注解,那么就可以用这种方式:
- 定义一个注解
package com.lagou.zhujie; import java.lang.annotation.Repeatable; /** * 自定义注解,用于描述人物的角色 */ public @interface ManType { String value()default ""; }
- 定义另一个注解,values为上面的注解的数组。
package com.lagou.zhujie; public @interface ManTypes { ManType[] value(); }
- 在使用该注解的类中这样标注:
package com.lagou.zhujie; @ManTypes({@ManType("职工"),@ManType("老师")})//在Java8以前处理多个注解的方式。 public class Man { }
-
在你Java8之后出现了一个repeat关键字。我们只需进行如下操作。
package com.lagou.zhujie; import java.lang.annotation.Repeatable; /** * 自定义注解,用于描述人物的角色 */ @Repeatable(value = ManTypes.class) public @interface ManType { String value()default ""; }
在man类里面多次加入注解即可。
package com.lagou.zhujie; @ManType(value = "学生") @ManType(value = "老师") public class Man { }
-
从Java8开始对元注解@Target的参数类型ElementType枚举值增加了俩个
-
其中ElementType.TYPE_PARAMETER表示该注解能卸载类型变量的声明语句中,如:泛型
-
其中ElementType.TYPE_USE表示该注解能卸载使用类型的任何语句中。
-
-
常见的预制注解:
注解名称 注解作用 @author 表明开发该类模块的作者是谁 @version 表明开发的版本 @see 参考转向,相关的主题 @since 从那个版本开始增加的 @param 对方法中某个参数的说明 @return 对方法返回值的说明 @exception 对方法可能抛出的异常进行说明 @Deprecated 表示这个方法已经过时了 -