【问题标题】:Why declare an interface as abstract?为什么要将接口声明为抽象的?
【发布时间】:2011-01-09 04:53:48
【问题描述】:

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

例如。

public abstract interface Presenter {
 public abstract void go(final HasWidgets container);
}

【问题讨论】:

    标签: java oop interface


    【解决方案1】:

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

    请扔掉这个链接 https://javaconceptoftheday.com/java-interview-questions-on-interfaces/

    自 JAVA8 以来接口可以有静态方法

    【讨论】:

      【解决方案2】:

      “为什么将接口声明为抽象的?”-我也有同样的问题,并认为抽象是多余的。但是当我在java 1.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();
      }
      

      【讨论】:

        【解决方案3】:

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

        由于严格的技术原因,接口本身的 abstract 修饰符可能是多余的,因为永远不能使用 new 运算符实例化接口,并且如果通过反射询问接口将始终是抽象的。

        但是,声明接口抽象可能有语义原因(各种 UML 工具也支持): 您可能希望以非抽象类可能不会直接实现接口而只能通过子接口实现接口的方式明确声明接口是抽象的。 所以例如您可能会认为接口 Node 在语义上是抽象的,而扩展 Node 的子接口 Folder 和 File 在语义上不是抽象的。你永远不会有一个只是一个节点的实例——它要么是一个文件夹,要么是一个文件。

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

        【讨论】:

          【解决方案4】:

          您在哪里看到了您发布的大量代码,任何旧的 Java 代码库?
          这就是JLS 不得不说的:

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

          9.4 抽象方法声明:
          为了与旧版本的 Java 平台兼容,允许但 从风格上讲,不鼓励过多地指定抽象修饰符 用于接口中声明的方法。

          【讨论】:

          • @Sudhir,在谷歌上搜索你发布的代码块 我遇到了这个讨论相同问题的邮件线程:osdir.com/ml/Google-Web-Toolkit/2010-01/msg00452.html 另见:osdir.com/ml/Google-Web-Toolkit/2010-01/msg00516.html,其中提到了可能的用法解释。 (解释一下:作为抽象类开始的内容可能已更改为与未删除的较早修饰符的接口)
          • 嗯……这就解释了。
          • 该死的神谕!!!该链接只是重定向到 oracle java 年表网站,漂亮的公司作品,一旦你获得它,甚至不关心历史证据。
          • @sateesh 你的意思是 HibernateSessionFactory 写的是旧程序吗?
          • 我在 JDK 11 编译的编译代码中看到了这个
          【解决方案5】:

          看看这篇文章

          https://stackoverflow.com/questions/4380796/what-is-public-abstract-interface-in-java/4381308#4381308

          接口是 %100 抽象类。

          关键字abstract在这里是多余的

          【讨论】:

            【解决方案6】:

            没有必要将接口声明为抽象的。由于接口中的方法只是抽象的.. 还有一件事,抽象类可以同时具有具体和抽象方法,但在接口中应该只有抽象方法。

            【讨论】:

            • 如果我没记错的话,一个接口可以有具体的方法(静态)。
            【解决方案7】:

            没有区别 - 接口和接口方法始终是抽象的,但您不必添加修饰符(接口方法始终是公共的,因此您也不需要 public 修饰符)。

            来自JLS

            9.1.1.1 抽象接口

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

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

              • 难道不是相反的(正如这个线程所证明的那样)。如果有人真的在编写接口,他们必须知道接口是什么。 IMO 这更令人困惑。
              • 如果代码不只是你自己,你应该把想法写在别人身上。
              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

                接口和接口方法是隐含的abstract,即使没有这样声明。所以不需要明确指定。

                【讨论】:

                • 所有接口方法也隐含public,因此声明它们也是多余的。
                • 方法上的“public”也是如此:它是隐式的,不需要。
                • "public" 使其更加明确并且有利于 IMO 的可读性。摘要在这种情况下毫无意义。
                • @Keith:不是为了打架,而是这里方法前面的“public”和“abstract”到底有什么区别?两者都是隐含的,无法更改。为什么要写一个,一个不写?
                • @Joachim:我认为并非所有开发人员都会意识到默认情况下接口是公共的。我一直认为完全限定某事物是否为公共/受保护/私有是一种很好的做法。根据接口的定义,它是抽象的
                【解决方案11】:

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

                这些方法也是公开的,所以你也可以跳过它。 :-)

                【讨论】:

                  猜你喜欢
                  • 2010-10-13
                  • 2011-04-06
                  • 1970-01-01
                  • 2018-07-19
                  • 1970-01-01
                  • 2013-08-24
                  • 2011-01-23
                  • 1970-01-01
                  • 2020-07-06
                  相关资源
                  最近更新 更多