一内建注解
@Override 表示覆盖或重写父类的方法。要求是:方法名称、参数的类型及个数完全相同,如果写错,会提示编译错误。
@Deprecated 表示该方法已经过时了。当方法或是类上面有@Deprecated注解时,说明该方法或是类都已经过期不能再用,但不影响以前项目使用,提醒你用新的方法或类代替。如果程序员不小心使用了它的元素,那么编译器会发出警告信息。
@SuppressWarnings 表示忽略指定警告,比如@Suppvisewarnings("Deprecation")。
二 不用 @Override的样子
1 代码
class Message {
public String tostring() { //原来打算重写toString()
return "Hello";
}
}
class OverrideError
{
public static void main(String[] args)
{
System.out.println(new Message());
}
}2 运行结果
Message@1540e19d
3 说明
原本打算重写toString()方法,却由于手误写成了tostring,不会产生编译错误,因为JDK会认为它是一个新方法,可是从实际需要来看,应该是要重写toString方法。
因此就发明了@Override,它用在方法之上,就是用来告诉编译器,这个方法是重写父类同名方法,如果父类没这个同名方法,就会发出警告信息。
三 用@Override后的的样子
1 代码
public class TestAnnatation {
}
class Message {
@Override
public String tostring() { //这一行会产生编辑告警
return "Hello";
}
}
class OverrideError
{
public static void main(String[] args)
{
System.out.println(new Message());
}
}2 运行结果
连编译都没通过,更不用提运行结果
3 说明
会产生编译告警。
public String tostring()修改为public String toString()再运行,结果正常显示Hello
四 关于@Deprecated一个实实在在的例子
String有一个构造函数如下,注解了@Deprecated,代码如下:
@Deprecated
public String(byte ascii[], int hibyte) {
this(ascii, hibyte, 0, ascii.length);
}如果用该构造函数进行初始化,IDEA界面如下所示:
这个过时的方法并不能将多个字节准确地转换为字符,该方法过时了,用@Deprecated标注,所以出现了界面上的删除线。
五 给自定义的方法加个@Deprecated
1 代码
class DeprecatedAnnotation{
public static void main(String[] args)
{
Info info=new Info();
//并不会产生编译错误,程序可以正常运行,只是并不建议使用该方法,因为它已经过时了,过时的方法保留到近
//是为了保证对过去软件开发的兼容性
System.out.println(info.getinfo());
}
}
class Info{
@Deprecated //用来建议别人不用使用某些旧的方法(或API),这时编译的时候会产生告警
public String getinfo(){
return "hello world";
}
}2 运行结果
hello world
六 不使用@SuppressWarnings的样子
会提示警告。
七 使用@SuppressWarnings的样子
class Testclass
{
public static void main(String[] args)
{
//用于选择地关闭编辑器对类、方法、成员变量初始化的警告
@SuppressWarnings("unused")
int i;//虽然局部变量i声明了没使用,也不会弹出警告信息。
System.out.println("hello");
}
}八 赏析一下三个内置注解的定义
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}在此抛砖引玉,后文自定义注解会参考这些定义的格式。