Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么要将接口声明为抽象接口?_Java_Oop_Interface - Fatal编程技术网

Java 为什么要将接口声明为抽象接口?

Java 为什么要将接口声明为抽象接口?,java,oop,interface,Java,Oop,Interface,将接口声明为抽象接口有什么意义?接口方法也是如此。这有什么意义吗 例如 通常,您不会将接口或其方法声明为抽象。它们是含蓄的 这些方法也是公共的,因此您也可以跳过它。:-) 接口和接口方法是隐式的抽象的,即使没有这样声明。因此,不需要显式地指定它。接口的默认行为本质上等同于示例中的行为。将其定义为抽象只是多余的。我认为只是冗长、明确和与类语法和语义的一致性 您不必这样做,但如果您的代码的某些读者分心或对Java不太熟悉,这可能会有所帮助。没有区别-接口和接口方法总是抽象的,但您不必添加修饰符(并且

将接口声明为抽象接口有什么意义?接口方法也是如此。这有什么意义吗

例如


通常,您不会将接口或其方法声明为抽象。它们是含蓄的


这些方法也是公共的,因此您也可以跳过它。:-)

接口和接口方法是隐式的
抽象的
,即使没有这样声明。因此,不需要显式地指定它。

接口的默认行为本质上等同于示例中的行为。将其定义为抽象只是多余的。

我认为只是冗长、明确和与类语法和语义的一致性


您不必这样做,但如果您的代码的某些读者分心或对Java不太熟悉,这可能会有所帮助。

没有区别-接口和接口方法总是抽象的,但您不必添加修饰符(并且接口方法总是公共的,所以您也不需要公共修饰符)

从:

9.1.1.1抽象接口

每个接口都是隐式抽象的。这 修饰符已过时,不应使用 在新程序中使用


您在哪里发现了您发布的代码块,任何旧的java代码库?
这是政府必须说的:

9.1.1.1抽象接口:
每个接口都是隐式抽象的。此修饰符已过时,不应使用 可以在新程序中使用

9.4抽象方法声明:
为了与旧版本的Java平台兼容,这是允许的,但是 作为一种风格,不鼓励冗余地指定抽象修饰符
对于在接口中声明的方法。

没有必要将接口声明为抽象的。因为接口中的方法是抽象的。。
还有一件事,抽象类既可以有具体的方法也可以有抽象的方法,但是在接口中应该只有抽象的方法。

看看这篇文章

接口是%100抽象类


关键字abstract在这里是多余的

接口方法的抽象修饰符和公共修饰符总是多余的

由于严格的技术原因,接口本身上的抽象修饰符可能是多余的,因为永远不能使用新操作符实例化接口,并且如果通过反射请求,接口将始终是抽象的

但是,声明接口抽象可能有语义上的原因(也受各种UML工具的支持): 您可能希望以非抽象类不直接实现接口而仅通过子接口实现接口的方式来表示接口是显式声明为抽象的。 因此,例如,可以将接口节点视为语义抽象,而扩展节点的子接口文件夹和文件语义上不是抽象的。您将永远不会有一个只是节点的实例—它将是文件夹或文件

甚至还有允许接口“实例化”的框架(技术上通过动态代理)。有些接口(例如预定义的基本接口)不允许作为参数提供。出于文档目的,在源代码中使用抽象修饰符来表示此类信息是有意义的。

为什么要将接口声明为抽象?——我也有同样的问题,认为抽象是多余的。但是当我在Java1.8中看到Map接口时,我不得不重新思考。这可能在java中必须改变吗

//  (version 1.8 : 52.0, no super bit)
// Signature: <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;
public abstract interface java.util.Map {

  // Method descriptor #1 ()I
  public abstract int size();
}
/(版本1.8:52.0,无超级位)
//签名:Ljava/lang/Object;
公共抽象接口java.util.Map{
//方法描述符#1()I
公共抽象int size();
}

问题:我们可以用“abstract”关键字声明接口吗? 答:是的,我们可以用“abstract”关键字声明一个接口。但是,没有必要这样写。默认情况下,java中的所有接口都是抽象的。这同样适用于接口方法

请去扔这个链接


接口可以有静态方法,因为JAVA8

所有接口方法也隐式地
公共
,这使得声明它们也是多余的。方法上的“public”也是如此:它是隐式的,不需要。“public”在我看来,这使它更明确,也有利于可读性。在这种情况下,抽象是毫无意义的。@Keith:我不想挑起争论,但在这里,在方法前面的“public”和“Abstract”到底有什么区别?两者都是隐式的,无法更改。为什么一个应该写,另一个不应该写?@Joachim:我认为并不是所有开发人员都会意识到默认情况下接口是公共的。我一直认为完全限定某物是否为公共/受保护/私有是一种好的做法。根据接口的定义,它是抽象的,不是吗(正如这个线程所证明的那样)。如果有人真的在编写接口,他们必须知道接口是什么。在我看来,这更让人困惑。如果代码不仅仅是为你自己编写的,你应该用其他代码来思考。@Sudhir,用谷歌搜索你发布的代码块。我遇到了一个讨论相同问题的邮件线程:另请参阅:其中提到了可能的用法解释。(意译:作为一个抽象类开始的内容可能已经被更改为与前面的修饰符的接口,但没有被删除)Hmmm。。。那就可以解释了。该死的甲骨文!!!链接只是重定向到oracle java编年史网站,相当公司的工作,甚至不关心您获得它后的历史证据。@sateesh您的意思是HibernateSessionFactory编写的是旧程序吗?我在JDK 11编译的编译代码中看到了这一点。如果我记得清楚,接口可以有具体的方法(静态)。
//  (version 1.8 : 52.0, no super bit)
// Signature: <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;
public abstract interface java.util.Map {

  // Method descriptor #1 ()I
  public abstract int size();
}