一、最重要的一句话

注解本身不做任何事,它的作用只有描述代码,学习spring时和基础阶段的某些代码上加上注释,触发了特定的行为这并不是注解所做的,而是框架和编译器看到注解后所做的,注解就像一本书上所划的标记,代码就像书的内容,看书的人就像编译器和框架,当看书时遇到这些标记,会触发行为如仔细看,跳过,但这是人做的而不是注解做的。

二、Java内置注解详解

Java提供了4个核心内置注解(JDK自带),它们由编译器直接处理。下面逐一解析,附带使用示例。

1. @Override:重写方法的“校验器”
  • 作用:标记方法为覆盖父类方法,编译器会检查父类是否存在同名方法。
  • 为什么重要:重写父类方法时,如果加入这个注解可以判断是不是重写父类中的方法,如果在父类中不存在,会报错(这是编译器做的,不是注解本身)
  • 示例:java
    class Parent {
        void sayHello() { System.out.println("Parent"); }
    }
    
    class Child extends Parent {
        @Override // 编译器会检查父类是否有sayHello()
        void sayHello() { System.out.println("Child"); } // 正确
    }
    
    class WrongChild extends Parent {
        @Override // 编译器报错:父类无此方法(拼写错误)
        void sayHelloe() { } // 错误!
    }

    关键点:若去掉@Override,代码仍能编译运行,但编译器无法帮你发现重写错误

2. @Deprecated:过时方法的“警示灯”
  • 作用:标记方法/类为过时,使用时IDE会显示删除线警告,但代码仍可编译运行
  • 为什么重要:向开发者传递“此功能已弃用,请改用新方法”的信号。
  • 示例:java

    编辑

  • 最佳实践:在@Deprecated后添加@Deprecated注释结合javaDoc,说明替代方案:java

    编辑

  • 效果:鼠标悬浮在方法上

3. @SuppressWarnings:警告的“屏蔽罩”
  • 作用抑制特定编译器警告(如未检查的泛型警告、未使用的变量)。
  • 为什么重要:当代码逻辑安全但编译器误报警告时,避免无意义的编译报错。
  • 示例:java

    编辑

    @SuppressWarnings("unchecked") // 抑制unchecked警告
    public List<String> getNames() {
        return (List<String>) (List) new ArrayList(); // 未检查的强制转换
    }
  • 注意
    • 优先用@SuppressWarnings("unchecked")而非全局抑制(如@SuppressWarnings("all"))。
    • 不常用?不!在泛型、反射等场景中非常常见(如Spring框架中常用)。
4. @FunctionalInterface:函数式接口的“守门员”
  • 作用:标记接口为函数式接口(仅含1个抽象方法),编译器会强制检查。
  • 为什么重要:Java 8引入Lambda表达式后,确保接口符合函数式要求(如RunnableComparator)。
  • 示例:java

    编辑

    @FunctionalInterface // 编译器检查:只能有1个抽象方法
    public interface MyFunction {
        void execute(); // 仅有一个抽象方法
    }
    
    // 错误!添加第二个抽象方法会触发编译错误
    @FunctionalInterface
    public interface WrongFunction {
        void execute();
        void anotherMethod(); // 编译报错:Too many abstract methods
    }
  • 关键点@FunctionalInterface编译器校验工具,不是强制要求(不加也能用Lambda,但编译器无法保证唯一性)。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐