为什么接口不能有字段?

Ube*_*ffe 5 java interface

忽略所有内容直到第二次编辑

我正在尝试做这样的事情:

public interface IModifier{
   public String nameTag;
   public void foo();
}
Run Code Online (Sandbox Code Playgroud)

我尝试这样做的原因是:我有一个类 SpecificModifier 实现了 IModifier 并且有许多非常相似的类也实现了 IModifier。我希望每个实现 IModifier 的类都有一个公共字符串 nameTag。

编辑:我已经确认我不能这样做,但是有人可以解释为什么接口不能需要字段吗?

编辑二:

我对抽象类与接口的目的的理解。接口纯粹用于声明实现它的任何内容的必要部分,以便所有对象都有可以引用的公共部分。而抽象类用于为多个类提供通用功能。

这有点过于简单化了,但无论如何,除了语言设计者的疏忽之外,我仍然没有理由认为接口不能具有抽象字段。

任何人都可以提供一个原因吗?

小智 5

接口指定了一个契约,实现该接口的具体类必须遵守该契约。该合同描述了实施应该如何运作。在接口规范中,应该有明确的注释来描述每个方法的用途。接口的使用将契约与实际实现分离。字段是一个实现细节,因为字段不描述类应该如何“充当”。

例如,接口通常用作声明类型,而具体实现则用作实际类型。

    Map<Key,Value> m = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

考虑一下 java.util.Map 接口。它通过其一组方法描述了 Map 应该如何运行。Map 接口有多种不同的实现,允许用户根据自己的需要选择正确的实现。

指定某个字段必须由多个子类使用意味着存在某种类层次结构。在这种情况下,抽象类可以解决这个问题。

   abstract class IModParent implements IModifier{
      protected String nameTag;
   }
Run Code Online (Sandbox Code Playgroud)

现在你可以上一堂具体的课了。

   class SpecificModifier extends IModParent{

      SpecificModifier(String nameTag){ this.nameTag = nameTag; }

      @Override
      public void foo(){ System.out.println(nameTag); }
   }
Run Code Online (Sandbox Code Playgroud)

并发表声明。

    IModifier imod = new SpecificModifier("MyName");
Run Code Online (Sandbox Code Playgroud)

这使您可以灵活地使用接口类型,同时仍然能够通过不可实例化的抽象类在您想要的具体类组中共享实现细节。