JavaSE新特性
2018/07/31 15:52
枚举
实际上枚举就是一种高级的多例设计模式。
Enum类
虽然JDK1.5提供了enum关键字,但是enum并不是一种新的结构,相反,它只是对一种类型的包装:使用enum关键字定义的枚举类本质上就相当于一个Class定义的类,继承了java.lang.Enum父类。
在Enum 类里面有以下方法:
构造方法
protected Enum(String name, int ordinal)
取得枚举名字:
public final String name()
取得枚举序号:
public final int ordinal()
例:
enum Color {
RED, GREEN, BLUE
}
public class TestDemo {
public static void main(String[] args) {
System.out.println(Color.BLUE.ordinal() + "=" + Color.BLUE.name());
}
}
所有的枚举类默认继承于Enum类
在枚举操作中还有一个方法可以取得所有枚举数据:values()返回的是一个枚举的对象数组。
例:取得所有枚举数据
enum Color {
RED, GREEN, BLUE
}
public class TestDemo {
public static void main(String[] args) {
for(Color temp : Color.values() {
System.out.println(temp.ordinal()+"=" + temp.name());
}
}
}
enum 与 Enum 区别
enum 是一个关键字,使用enum定义的枚举类本质上就相对于一个类继承了Enum这个抽象类而已。
枚举中定义其他结构
考虑多利设计模式,因此,可以在enum的枚举中定义更多的属性,方法,实现接口。
例:在枚举中定义更多的结构
package www.jason.java.testdemo;
enum Color {
RED("红色"), GREEN("绿色"), BLUE("蓝色"); // 如果定义有很多内容,枚举对象必须写在第一行
private String title;
private Color(String title) { // 构造方法私有化
this.title = title
}
@Override
public String toString() {
return this.title;
}
}
public class TestDemo {
public static void main(String[] args) {
System.out.println(Color.BLUE);
}
}
枚举还可以实现接口,这样枚举中的每一个对象都变成了接口对象。
例:枚举实现接口
package www.bit.java.testdemo;
interface IColor {
public String gerColor();
}
enum Color implements IColor {
RED("红色"), GREEN("绿色"), BLUE("蓝色"); // 如果定义很多内容,枚举对象必须写在第一行
private String title;
private Color(String title){ // 构造方法私有化
}
@Override
public String toString() {
return this.title;
}
@Override
public String getColor() {
return this.title;
}
}
public class TestDemo {
public static void main(String[] args) {
IColor iColor = Color.BLUE;
System.out.println(iColor.getColor());
}
}
枚举应用
枚举的最大特点是只有指定的几个对象可以使用。
枚举本身还支持switch
例switch使用枚举:
package www.jason.java.testdemo;
enum Sex {
MALE, FEMALE
}
public class TestDemo {
public static void main(String[] args) {
switch(Sex.MALE) {
case MALE :
System.out.println("男人");
break;
case FEMALE :
System.out.println("女人");
break;
}
}
}
详细了解请看大神分析:
https://blog.csdn.net/javazejian/article/details/71333103
注解(Annotation)
JDK提供的三个内置注解:
- @Override
- @Deprecated
- @SupperssWarnings
准确覆写(@Override)
方法覆写:发生在继承关系之中,子类定义了与父类的方法名称相同,参数列表相同,返回值类型相同称为方法的覆写,被覆写的方法不能够拥有比父类更为严格的访问控制权限。
1、Annotation的前提是需要有代码容器,才可以实现自定义的Annotation。
2、反射取得Annotation信息
在java.lang.reflect.AccessibleObject(java.lang.Class)类中提供有如下与Annotation方法:
取得全部Annotation:public Annotation[] getAnnotations()
取得指定的Annotation:public T getAnnotation(Class annotationClass)
注意:Annotation本身有自己的保存范围,不同的Annotation的返回也不同。
反射可以取得结构上定义的Annotation,Annotation的设计离不开反射
3、Annotation作用范围
Annotation的作用范围在一个枚举类(java.lang.annotation.RetentionPolicy)中定义:
SOURCE:在源码中出现的Annotation,会被编译器丢弃(该类型的注解信息只会保留在源码里,源码经过编译后,注解信息会被丢弃,不会保留在编译好的class文件里)
CLASS:在*.class中出现的Annotation,会被JVM丢弃(该类型的注解信息会保留在源码里和class文件里,在执行的时候不会加载到虚拟机中)
注意:当注解未定义Retention值时,默认值是CLASS,如Java内置注解,@Override, @Deprecated, @SuppressWarning等
RUNTIME:在类执行的时候出现的Annotation,注解信息在运行期(JVM)也保留,因此可以通过反射机制读取注解的信息(源码, class文件和执行的时候都有注解的信息),如SpringMVC中的@Controller, @Autowired, @RequestMapping等。
4、自定义Annotation
5、取得某一个具体的Annotation信息,也是Class类中的一个方法
Annotation getAnnotation(注解类.class);
然后可以获取到注解里的属性信息
6、注解的一些特点
元素不能有不确定的值:元素要么具有默认值,要么在使用注解的时候提供元素的值。
注解不支持继承:不能使用关键字extends来继承某个@interface,但注解在编译后,编译器会自动继承java.lang.annotation.Annotation接口,
快捷方式:对于有一个为value的元素,如果该元素是唯一需要赋值的一个元素,那么可以不用写成key=value的语法,而只需在括号内给出value元素所需要的值即可,注意这限定了元素名必须是value
7、Java常用内置注解
@Override : 用于表明此方法覆盖了父类的方法
@Deprecated :用于标明已经过时的方法或类
@SuppressWarnings :用于有选择的关闭编译器对类,方法,成员变量,变量初始化的警告
8、元注解
标注其他注解的注解
详细了解请看大神分析:
https://blog.csdn.net/javazejian/article/details/71860633