Java 中的 interface 和 @interface 有什么区别?

理解接口和@interface之间的区别 至关重要,因为它们在 Java 编程中扮演着不同的角色。接口用于定义类型和契约。@ interface用于向编译器或运行时提供元数据。

让我们深入了解一下什么是接口interface 和@interface 以及它们的应用。接口是实现它的类的契约。在最常见的形式中,它是一组具有空体的相关方法。

另一方面,@ interface 允许您向代码添加元数据。编译器、工具或框架会使用此元数据来影响类的行为或处理。

接口interface
接口 就像是其实现类的契约。它指定了其实现类必须实现的行为,但没有规定如何实现。它表明实现该接口的任何类都必须为其所有方法提供具体的实现。

public interface Animal {
    String eat();
    String sleep();
}
public class Dog implements Animal {
    @Override
    public String eat() {
        return "Dog is eating";
    }
    @Override
    public String sleep() {
        return
"Dog is sleeping";
    }
}

所有接口方法都隐式地是公共和抽象的(默认方法和静态方法除外),并且所有字段都是公共的、静态的和最终的。我们可以使用接口在 Java 中实现抽象、多重继承和松散耦合。

抽象:接口仅显示调用方法所需的基本信息,而实现的复杂性仍然被隐藏。

多重继承:一个类可以实现多个接口,从而避免在允许类多重继承的语言中可能出现的菱形问题。

松耦合:接口在功能和实现细节之间提供了明显的分离。它允许类改变其内部流程而不会影响其用户,因为我们分别定义方法和签名。

@interface
在 Java 中,我们使用@interface来声明注释类型。注释提供了一种向 Java 代码元素(如类、方法和字段)添加元数据的方法。因此,工具和库可以利用这些元数据在编译过程或运行时收集信息以进行代码处理。

让我们创建一个@Review自定义注释,我们可以使用它来跟踪谁在何时审查了一段代码:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Review {
    String reviewer();
    String date() default "";
}

请注意,使用@interface定义Review注释时, 我们将其定义为常规接口。我们的方法名称和返回类型使用原始数据类型甚至数组。但是,我们不能使用复杂对象作为返回类型。

此外,在使用Review注释时,我们需要为所有上述定义的属性提供值。有一种方法可以在声明时定义默认值。如果我们在使用注释时并不总是需要提供的值,我们可以使用它。

另外,还有一点需要注意,那就是@interface定义上方的@Retention和@Target注释。  @Retention(RetentionPolicy.SOURCE)注释使我们的注释在源代码中可用。@Target({ElementType.METHOD})注释指定Review注释将仅适用于 Java 类中的方法。

现在,我们在服务方法中使用@Review注解:

@Review(reviewer = "Natasha", date = "2024-08-24")
public String service() {
    return
"Some logic here";
}


目的不同:

  • 接口interface用于定义类可以实现的契约。
  • @interface:用于定义自定义注释。

用法不同:

  • 接口interface:由类实现来提供特定的行为。
  • @interface:用于注释代码元素(类、方法、字段等)以提供元数据。

使用案例:

  • 接口interface:    为了实现抽象,Java 中的多重继承以及将方法与其实现分离。  
  • @interface: 定义自定义注释,可以为支持代码文档、配置、代码生成和验证的框架提供元数据。