枚举和注解
枚举类型
可以作为顶层声明,也可以像内部类一样在其他类的内部声明,但不能在方法内部声明枚举。
枚举类型的实例是常量。
在枚举类型的声明中,除了常量外还可以声明构造方法,成员变量和其他方法。但枚举常量必须在任何其他成员的前面声明。
public enum Direction{
EAST,SOUTH,WEST,NORTH;
}
//enum:关键字
//Direction:枚举类型名
任何枚举类型都隐含地继承了java.lang.Enum抽象类,Enum类又是Object类的子类,同时实现了Comparable接口和Serializable接口。
public static E[] values():返回一个包含所有枚举常量的数组。
public static valueOf(String name):返回指定名字的枚举常量。
public final compareTo(E o):返回当前枚举对象与参数枚举对象的比较结果。
public final String name():返回枚举常量名。
public final int ordinal():返回枚举常量的顺序值(基于常量声明的顺序,从0开始)。
public String toString():返回枚举常量名。
public class EnumDemo[
public static void main(String[] args){
//声明一个枚举类型变量,并用一个枚举赋值
Direction left = Direction.WEST;
System.out.println(left);//输出WEST
//输出每个枚举对象的序号
for(Direction d:Direction.values()){
System.out.println(d。name()+",序号"+d.ordinal());
}
}
]
注解类型
作用
-
为编译器提供信息。编译器可以使用注解检测错误或阻止编译警告。
-
编译时或部署时处理,软件工具可以处理注解信息生成代码、XML文件等。
-
运行时处理。有些注解在运行时可以被检查。
注解类型是一种特殊的接口类型,注解是注解类型的一个实例。
注解中包含的信息采用“键/值”对的形式,可以有零个或多个“键/值”对,且每个键有一个特定类型(如String,int......)。
没有“键/值”对的注解类型称作标记注解类型,如果注解只需要一个键值对,则称为单值注解类型。
对每个没有默认值的元素,都应该以name=value的形式对元素初始化。
3个注解类型
java语言中定义了3个注解类型,供编译器使用,定义在java.lang包中。
Override
是一个标记注解类型,可以用在一个方法的声明中,使用该注解可以防止程序员在覆盖某个方法时出错。如果要覆盖的方法不是父类中的方法,编译器会产生一个编译错误。
Deprecated
是一个标记注解类型,可以应用于某个方法或某个类型,指明方法或类型已被弃用。警告用户不应该使用或覆盖该方法。
SuppressWarnings
指示编译器阻止某些类型的警告,具体的警告类型可以用初始化该注解的字符串来定义。该注解可应用与类型、构造方法、方法、成员变量、参数以及局部变量。传递一个String数组,包含需要阻止的警告。
@SuppressWarnings(value={"unchecked","serial"})
//unchecked:未检查的转换警告
//deprecation:使用了不推荐方法的警告
//serial:实现Serializable接口但没有定义serialVersionUID常量的警告
//rawtypes:如果使用旧的语法创建泛型类对象时发出的警告
//finally:任何finally子句不能正常完成的警告
//fallthrough:switch块中某个case后没有break语句的警告
定义注解类型(@interface)
默认情况下,所有的注解类型都扩展了java.lang.annotation.Annotation接口。
在注解中声明的方法称为注解类型的元素,类似于接口中的方法声明,没有方法体,但有返回类型。元素的类型只能是基本类型、String、枚举类型、其他注解类型,且元素不能声明任何参数。
可用default关键字为元素指定默认值。
public @interface ClassInfo{
String created();
String author() defaule 0;
}
如果注解类型只有一个元素,这个元素应该命名为value。
元注解
对注解进行标注的注解。
Documented:用于对一个注解类型的声明进行标注 。
Inherited:用Inherited标注的注解类型的任何实例都会被继承。
Retension:指明被标注的注解保留多长时间。
SOURCE:仅存于源文件中。
CLASS:保存在类文件中。
RUNTIME:表示要被JVM保存的注解。
@Retension(value=SOURCE)
Target:指明程序元素可以被标注的注解类型进行标注。
ANNOTATION_TYPE:可以对注解类型标注。
CONSTRUCTOR:构造方法
FIELD:成员的声明
LOCAL_VARIABLE:局部变量
METHOD:方法
PACKAGE:包
PARAMETER:参数声明
TYPE:类型声明
@Target(value=METHOD)对Override使用,只适用于方法声明。
接口
定义
public interface InterfaceName{
//定义常量、抽象方法、静态方法、默认方法
}
-
接口不能用new运算符创建接口的实例。
-
接口中的抽象方法可省略修饰符。
-
一个接口可以继承一个或多个接口。
-
接口的静态方法使用“接口名.方法名()”访问。接口的静态方法不能被子接口继承,也不被实现类继承。
-
可以给接口中任何方法提供一个默认实现,称为默认方法,用default关键字定义。
-
默认方法需要通过引用变量调用。
-
如果一个类从父类和接口继承了同样的方法,采用“类比接口优先”原则。
实现
public class ClassName implements InterfaceList{
//类体定义
}
-
一个类可以实现多个接口,用逗号隔开。
-
如果实现接口的类不是abstract类,则在类的定义部分必须实现接口中的所有抽象方法。
-
接口方法的访问修饰符都是public,所以类在实现方法时,必须显示使用public修饰符。
-
一个类实现多个接口就要实现每个接口中的抽象方法,接口中的常量和默认方法都被实现类继承,但接口中的静态方法不能被继承。