java中的interface和@interface有啥区别?

Posted

技术标签:

【中文标题】java中的interface和@interface有啥区别?【英文标题】:What's the difference between interface and @interface in java?java中的interface和@interface有什么区别? 【发布时间】:2010-10-29 10:30:12 【问题描述】:

自从 90 年代末在大学期间使用 JBuilder 后,我就没有接触过 Java,所以我有点脱节 - 无论如何,这周我一直在从事一个小型 Java 项目,并使用 Intellij IDEA作为我的 IDE,以改变我的常规 .Net 开发节奏。

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

public interface Test 

对比

public @interface Test 

我进行了一些搜索,但没有找到很多关于 @interface 的有用信息。

【问题讨论】:

【参考方案1】:

@ 符号表示注释类型定义。

这意味着它不是真正的接口,而是一种新的注解类型——用作函数修饰符,例如@override

看到这个javadocs entry关于这个主题。

【讨论】:

非常感谢,很高兴知道。那么将其称为@interface 的理由是什么,而不是说@annotation 我想知道.. 似乎是一个不必要的重载术语。 教程和 JLS 暗示注解是一种特殊的接口。关于这个主题似乎没有太多讨论,但javarunner.blogspot.com/2005/01/annotations-in-java-15.html 解释说注释是 Annotation 接口的隐式扩展,@ 和 interface 用于共同区分常规接口。您可能还想阅读 JSR 规范以了解注释。 @Bittercoder 文档确实提到:“关键字接口前面有 at 符号 (@)(@ = AT,如注释类型)”。这就是我能找到的所有理由。命名。 实际上,Bittercoder 的问题是不可避免的,DavidValeri 的链接很好地解释了它。所以,你可以这样写:@ interface,而不仅仅是@interface【参考方案2】:

界面:

一般来说,一个接口暴露了一个契约而不暴露底层的实现细节。在面向对象编程中,接口定义了暴露行为但不包含逻辑的抽象类型。实现由实现接口的类或类型定义。

@interface : (注解类型)

以下面的例子为例,它有很多 cmets:

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: 许多注释替换了代码中的 cmets。

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

【讨论】:

这实际上很有用。我不知道 Java 可以做到这一点。 上一个答案包括此链接,这是此信息的来源。我发现查找有关此主题的更多信息很有用。 docs.oracle.com/javase/tutorial/java/annotations/declaring.html 我在 *** 上看到的最好和完整的答案之一(但很清楚)。 我不确定为什么每个人都喜欢这个答案,而它给出的注释用例非常有限。 Java 中的注解不仅用于替代 cmets,还用于更多的事情。注释的强大之处在于它们可以改变带注释的元素在运行时的行为或处理方式 这对我帮助很大,很好的解释,谢谢!【参考方案3】:

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

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

【讨论】:

【参考方案4】:

interface: 为实现它的类定义契约

@interface: 定义一个注解的契约

【讨论】:

【参考方案5】:

界面 在 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

【讨论】:

以上是关于java中的interface和@interface有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

关于JAVA中的Synchronization和interface误用

OC中的@interface和java中的区别以及 @implementation @protocol

java interface 中的变量和方法

java里的interface接口类怎么用

java里的interface接口类怎么用?

java中的api和interface