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


306

自从90年代末在大学期间使用JBuilder以来,我还没有接触过Java,所以我有点与时俱进-无论如何,本周我一直在从事一个小型Java项目,并使用Intellij IDEA作为我的IDE ,与我的常规.Net开发有所不同。

我注意到它支持添加接口和@interface,什么是@interface,它与普通接口有何不同?

public interface Test {
}

public @interface Test {
}

我做了一些搜索,但是找不到大量有用的有关@interface的信息。

Answers:


322

@符号表示注解类型的定义。

这意味着它实际上不是一个接口,而是一个新的注释类型-用作函数修饰符,例如@override

请参阅此主题上的javadocs条目


7
非常感谢,很高兴知道。因此,调用它@interface的理由是什么,而不是说@annotation,我想知道..似乎是一个不必要的重载术语。
Bittercoder

5
本教程和JLS暗示注释是一种特殊的接口。关于该主题似乎没有太多讨论,但是javarunner.blogspot.com/2005/01/annotations-in-java-15.html解释了注释是Annotation接口和@和interface的隐式扩展。用于共同区别常规界面。您可能还需要阅读JSR规范中的注释。
DavidValeri,2009年

1
@Bittercoder的文档确实提到:“关键字界面前面有at符号(@)(@ = AT,与注释类型相同)”。这就是我可以找到命名的全部理由。
Shaishav

111

接口:

通常,接口公开合同而不公开基础实现细节。在面向对象的编程中,接口定义了抽象类型,这些抽象类型公开行为,但不包含逻辑。实现由实现接口的类或类型定义。

@interface :(注释类型)

以下面的示例为例,该示例有很多注释:

public class Generation3List extends Generation2List {

   // Author: John Doe
   // Date: 3/17/2002
   // Current revision: 6
   // Last modified: 4/12/2004
   // By: Jane Doe
   // Reviewers: Alice, Bill, Cindy

   // class code goes here

}

代替此,您可以声明注释类型

 @interface ClassPreamble {
   String author();
   String date();
   int currentRevision() default 1;
   String lastModified() default "N/A";
   String lastModifiedBy() default "N/A";
   // Note use of array
   String[] reviewers();
}

然后可以注释一个类,如下所示:

@ClassPreamble (
   author = "John Doe",
   date = "3/17/2002",
   currentRevision = 6,
   lastModified = "4/12/2004",
   lastModifiedBy = "Jane Doe",
   // Note array notation
   reviewers = {"Alice", "Bob", "Cindy"}
)
public class Generation3List extends Generation2List {

// class code goes here

}

PS: 许多注释会替换代码中的注释。

参考:http : //docs.oracle.com/javase/tutorial/java/annotations/declaring.html


11
很好的解释
Pat B

2
这实际上很有用。我不知道Java可以做到这一点。
杰伊·西德里

先前的答案包括此信息的链接。我发现找到有关此主题的更多信息很有用。 docs.oracle.com/javase/tutorial/java/annotations/declaring.html
PatS

1
我一直在目睹stackoverflow最好的和完整的答案之一(但很清楚)。
D先生

32

interface关键字表明您声明在Java中传统的接口类。
@interface关键字用于声明一个新的注释类型。

有关语法的说明,请参见docs.oracle注释教程。如果您真的想详细了解含义,
请参阅JLS@interface



8

接口 Java编程语言中的是一种抽象类型,用于指定类必须实现的行为。它们类似于协议。使用interface关键字声明接口

@interface 用于创建您自己的(自定义)Java批注。注释在它们自己的文件中定义,就像Java类或接口一样。这是自定义Java注释示例:

@interface MyAnnotation {

    String   value();

    String   name();
    int      age();
    String[] newNames();

}

本示例定义了一个名为MyAnnotation的注释,该注释具有四个元素。注意@interface关键字。这会向Java编译器发出信号,这是Java注释定义。

注意,每个元素的定义都类似于接口中的方法定义。它具有数据类型和名称。您可以将所有原始数据类型用作元素数据类型。您也可以使用数组作为数据类型。您不能将复杂对象用作数据类型。

要使用上面的注释,可以使用如下代码:

@MyAnnotation(
    value="123",
    name="Jakob",
    age=37,
    newNames={"Jenkov", "Peterson"}
)
public class MyClass {


}

参考-http://tutorials.jenkov.com/java/annotations.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.