【问题标题】:Why java interfaces can't contain static methods implementations?为什么java接口不能包含静态方法实现?
【发布时间】:2011-05-10 07:11:38
【问题描述】:

我只是好奇,让接口包含静态方法的实现不是更方便吗?此类方法可能包含简短的常用(由此接口实现者)逻辑。

【问题讨论】:

标签: java oop interface methods static


【解决方案1】:

因为界面描述了什么。它没有描述如何

【讨论】:

    【解决方案2】:

    如果你真的想在接口中添加(隐藏)一些逻辑,你可以考虑添加一个内部类(注意:永远不要这样做,这只是从纯技术角度展示什么是可能的):

    public interface Person {
      public String getFirstName();
      public String getLastName();
      public class Util {
        public String getName(Person person) {
          return person.getFirstName() + " " + person.getLastName();
        }
      }
    }
    

    如果你使用这个,它“感觉”有点像在接口中有静态方法代码:

    String fullName = Person.Util.getName(this);
    

    正如我所说 - 这纯粹是技术上的,我认为没有任何理由实际这样做。静态方法可以位于任何类中,无需添加到接口中。

    【讨论】:

      【解决方案3】:

      接口是一种契约。它说明了实现对象将具有什么(至少),但仅此而已。上面写着“这房子会有门、窗和烟囱”。

      抽象类更像是预制房屋。它不完整(例如,您必须添加自己的壁板)但它已经有零件(门有空间,但整个壁炉已经安装好了。

      在接口中提供代码的问题是多重继承。 Java 不允许。您可以让一个类实现许多接口,因为接口只承诺会有一个具有给定签名的方法。

      如果接口包含代码,那么您可以实现其中的 3 个,每个都有一个用于 myUsefulFunction(String thing) 的方法体...现在您不知道调用了哪个。

      这就是为什么抽象类可以有方法体(因为你只能扩展一个类),而接口不能(因为你可以实现多个接口)。

      【讨论】:

      • 在静态方法的情况下多重继承不会成为问题,因为它们是在编译时解决的。因此,当静态调用不明确时抛出编译错误是微不足道的。
      【解决方案4】:

      我同意静态方法在接口中没有意义。但我不明白为什么java允许接口中的静态成员。好像有点不协调。

      【讨论】:

        【解决方案5】:

        它是抽象类或常规类,应该实现一些东西。接口不应该有任何实现,但它们包含通信接口。所以不允许使用静态方法。

        【讨论】:

        • 从任何实现细节中抽象出客户端代码。客户不应该担心事情是如何完成的。
        【解决方案6】:

        接口是具有所有抽象方法的特殊抽象类。

        您可以随意创建自己的包含(非抽象)静态方法的抽象类,但您只能从其中一个继承。

        更好的是,使用您的静态方法创建一个单独的帮助类。

        【讨论】:

          猜你喜欢
          • 2011-04-26
          • 1970-01-01
          • 2016-10-06
          • 2015-02-12
          • 2010-11-18
          • 2017-12-28
          • 2012-06-05
          • 2015-03-14
          相关资源
          最近更新 更多