0

我读过接口中的字段只能表示常量值。我对此感到困惑。这是否意味着接口本身设置了这些值(常量接口反模式,这很糟糕)或者实现类可以为常量设置自己的值。

如果我有一堆不相关的类(由一些通用接口统一)并且想要添加一些关于它们的信息,那么后者会很有用。例如:

public interface Animal
{
  public void walk()
}

public class Cat implements Animal
{
  public void walk() 
  {
    doCatWalk();
  }
}

public class Dog implements Animal
{
  public void walk()
  {
    doDogWalk();
  }
}

现在假设我想编写一个方法来处理 anAnimal产生的噪音。为此,我需要知道噪音是什么——它是一个String变量,对于特定的动物来说是恒定的。我可以将界面更改为

public interface Animal
{
  public static final String NOISE;
  public void walk();
}

并且,例如,实现Cat为:

public class Cat implements Animal
{
  public static final String NOISE = "Miaow!";
  public void walk()
  {
    doCatWalk();
  }
}

还是不允许这样做?当然,我可以改用 getter,但我看到的通常做法是对常量使用public static final字段而不是public(隐式静态和最终)getter 方法。

4

1 回答 1

4

接口中的字段声明是隐式 public static final的。这个

public interface Animal
{
    public static final String NOISE;
    public void walk();
}

将无法工作,因为您尚未初始化NOISE. 即使你这样做了,字段也不能像方法一样被覆盖。所以

public class Cat implements Animal
{
    public static final String NOISE = "Miaow!";
    public void walk()
    {
        doCatWalk();
    }
    ...
}

只会有自己的static NOISE字段,您只能通过声明为的引用访问Cat

于 2013-09-26T12:32:24.743 回答