注解Annotation
注解Annotation是从JDK5.0开始引入的新特性。
Annotation的作用:
-
注解不是程序本身,可以对程序作出解释。(这一点,跟注释没什么区别)
-
可以被其他程序(比如:编译器等)读取。(注解信息处理流程,是注解和注释的重大区别。如果没有注解信息处理流程,则注解毫无意义)
Annotation的格式:
注解是以“@注释名”在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(value=”unchecked”)
Annotation在哪里使用
Annotation 可以像修饰符一样被使用, 可用于修饰包,类, 构造器, 方法, 成员变量, 参数, 局部变量。相当于给它们添加了额外的辅助信息,而且有些注解我们可以通过反射机制编程实现对这些元数据的访问。
在编译时进行格式检查
JDK中系统内置了常用的三个注解:
(1)@Override:按照重写的要求检查方法的格式
(2)@Deprecated:过时,表示不鼓励程序员使用这样的元素,因为存在危险或有更好的实现
(3)@SuppressWarnings:抑制警告
package com.annotation.javadoc;
public class TestAnnotation {
public static void main(String[] args) {
@SuppressWarnings("unused")
int a = 10;
}
@Deprecated
public void print(){
System.out.println("过时的方法");
}
@Override
public String toString() {
return "重写的toString方法()";
}
}
自定义注解
-
定义新的 Annotation 类型使用 @interface 关键字
-
Annotation 的成员变量在 Annotation 定义中以无参数方法的形式来声明. 其方法名和返回值定义了该成员的名字和类型. 我们称为配置参数。类型只能是八种基本数据类型、String类型、Class类型、enum类型、Annotation类型、以上所有类型的数组
-
可以在定义 Annotation 的成员变量时为其指定初始值, 指定成员变量的初始值可使用 default 关键字
-
如果只有一个参数成员,一般参数名为value
-
如果定义的注解含有配置参数,那么使用时必须指定参数值,除非它有默认值。格式是“参数名 = 参数值”,如果只有一个参数成员,且名称为value,可以省略“value=”
-
没有成员定义的 Annotation 称为标记; 包含成员变量的 Annotation 称为元数据 Annotation
注意:自定义注解必须配上注解的信息处理流程才有意义。
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType;
import java.lang.annotation.Annotation;
@MyAnnotation(value="嗯嗯嗯")
public class EnumTest {
public static void main(String[] args) {
//通过反射获取到类名 然后获取到注解
Class clazz = EnumTest.class;
Annotation a = clazz.getAnnotation(MyAnnotation.class);
MyAnnotation m = (MyAnnotation) a;
//获取上面的属性值
String info = m.value();
System.out.println(info);
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface MyAnnotation {
String value() default "eeee";
}
元注解
Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。
(1)@Target
(2)@Retention
(3)@Documented
(4)@Inherited
在java.lang.annotation包
1、@Target
作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
2、@Retention
@Retention定义了该Annotation被保留的时间长短
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
@Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用 @Rentention 时必须为该 value 成员变量指定值:
取值(RetentionPoicy)有:
SOURCE:在源文件中有效(即源文件保留)
CLASS:在class文件中有效(即class保留) 这是默认值
RUNTIME:在运行时有效(即运行时保留)当运行 Java 程序时, JVM 会保留注释. 程序可以通过反射获取该注释
3.@Documented.
Documented 注解表明这个注解应该被 javadoc工具记录。默认情况下,javadoc是不包括注解的,但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理。
4、@Inherited
允许子类继承父类中的注解
抽象方法的特点:
(1)没有方法体
(2)包含抽象方法的类,必须是抽象类
(3)当子类继承抽象类后,子类应该实现(重写)父类的抽象方法,否则子类也得是抽象类
抽象类的特点:
(1)不能实例化
(2)包含抽象方法的类,必须是抽象类,但是抽象类可以没有抽象方法
(3)抽象类如果没有抽象方法,目的就是不让你实例化
(4)抽象类和非抽象类一样:可以包含属性(类变量、实例变量)、构造器(无参、有参)、方法(静态方法、实例方法)、代码块(构造块和静态代码块)、内部类
(5)当子类继承抽象类后,子类应该实现(重写)父类的抽象方法,否则子类也得是抽象类
(6)抽象类与子类的对象构成多态引用
3、final关键字的用法与意义
final表示最终的
可以用于修饰:
(1)类,包括外部类和内部类:
这样的类不能被继承,是个太监类
(2)方法
这样的方法不能被重写,是个最终的方法实现
(3)属性,成员变量
这样的属性变成常量,值就不能被修改,而且这样的属性必须显式初始化或在每一个构造器或构造块中初始化
(4)局部变量
这样的局部变量变成常量,值不能被修改
基本数据类型:byte,short,int,long
float,double
char
boolean
声明类:class
创建实例:new
和包相关:package,import
权限修饰符:public,protected,private
其他修饰符:static,final,native,abstract
判断某个实例是否属于某个类型:instanceof
流程控制结构:if,else,switch,case,default,break
for,while,do,continue
表示方法没有返回值:void
用于结束方法或返回返回值:return
表示当前对象:this
表示父类引用:super
表示继承:extends
不是:
常用类:String,System
String,main,System,args