Java 我可以在接口中有一个表示常量的字段,实现类可以设置该字段吗?

Java 我可以在接口中有一个表示常量的字段,实现类可以设置该字段吗?,java,Java,我读过,接口中的字段只能表示常量值。我对此感到困惑。这是否意味着接口本身设置了这些值(常量接口反模式,这是错误的),或者实现类可以为常量设置它们自己的值 如果,比如说,我有一堆不相关的类(由某个公共接口统一),并且想要添加一些关于它们的信息,那么后者将非常有用。例如: public interface Animal { public void walk() } public class Cat implements Animal { public void walk() {

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

如果,比如说,我有一堆不相关的类(由某个公共接口统一),并且想要添加一些关于它们的信息,那么后者将非常有用。例如:

public interface Animal
{
  public void walk()
}

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

public class Dog implements Animal
{
  public void walk()
  {
    doDogWalk();
  }
}
现在假设我想写一个方法,它可以处理
动物发出的噪音。为此,我需要知道噪声是什么——它是一个
字符串
变量,对于特定的动物来说是常数。我可以把界面改成

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
(隐式static&final)getter方法处理常量

接口中的字段声明是
公共静态final
。这个

public interface Animal
{
    public static final String NOISE;
    public void walk();
}
无法工作,因为您尚未初始化噪音
。即使您这样做了,字段也不像方法那样是可重写的。所以

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

只有它自己的
静态噪声
字段,您只能通过声明为
Cat

的引用访问该字段。接口中的字段声明为
公共静态最终
。这个

public interface Animal
{
    public static final String NOISE;
    public void walk();
}
无法工作,因为您尚未初始化噪音
。即使您这样做了,字段也不像方法那样是可重写的。所以

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

只有它自己的
静态噪声
字段,您只能通过声明为
Cat

的引用访问该字段。您怎么能不初始化
静态最终
变量?您怎么能不初始化
静态最终
变量?