Java内建注解

一内建注解

@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();
}

在此抛砖引玉,后文自定义注解会参考这些定义的格式。


版权声明:本文为chengqiuming原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。