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

自从90年代末在大学里使用JBuilder后,我就没有接触过Java,所以我有点不熟悉Java——无论如何,这周我一直在做一个小的Java项目,并使用Intellij IDEA作为我的IDE,以改变我常规的。net开发的节奏。

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

public interface Test {
}

vs。

public @interface Test {
}

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

135387 次浏览

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

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

查看这个主题的javadocs条目

interface关键字表示你在Java中声明了一个传统的接口类 @interface关键字用于声明一个新的注释类型。< / p >

关于注释的描述请参见文档。甲骨文教程 如果你真的想了解@interface的详细含义,请参阅JLS

接口:

通常,接口公开契约而不公开底层实现细节。在面向对象编程中,接口定义了公开行为的抽象类型,但不包含逻辑。实现由实现接口的类或类型定义。

@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


}
< p > PS:

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

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

@interface:定义注释的契约

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

使用@interface定义注释,使用interface定义接口。

注释并不直接影响程序的语义,但是它们确实会影响工具和库处理程序的方式,这反过来又会影响正在运行的程序的语义。注释可以从源文件、类文件中读取,也可以在运行时反射地读取。

注释通常有两个主要用途:它们帮助定义编程契约(如@Nonnull注释),这意味着它们实际上什么都不做,而是为程序员和ide提供检测潜在错误代码的服务;还有运行时注释,通常由框架用于配置(如spring中的@Service注释):核心在你的范围内检测带有特定注释的类,并对它们应用逻辑(任何你能想到的例子,比如定义Java服务器,创建单例,等等)

一般来说,初级程序员在做一些正常的基础工作时,很少需要定义注解,但是接口的定义和使用是任何新开发人员都应该学习的基本知识,如果他们的能力允许的话:好的实践通常建议在代码中使用接口以提高可维护性。

就我个人经验而言,我几乎从学习Java的那一天起就开始定义和使用Java接口,但直到我专业使用Java的5 -6年,我才需要定义一个注释(用现有的注释标记东西是另一回事),而且这是一个非常具体的项目,一个代码自动生成器,有点像Lombok,但对客户来说更具体。

我想这取决于您的工作性质,但是到目前为止,我已经数不清我定义了多少个接口,但是注释可以用双手的手指来数。我相信Java开发人员很有可能在开始和结束他们的整个职业生涯时都不需要定义一个接口(除非您使用swagger基于注释的文档生成xD)