2013-09-26 21 views
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(); 
    } 
} 

现在假设我想写上的Animal发出的噪音奏效的方法。为此,我需要知道噪音是什么 - 它是一个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(隐含地为静态& final)常量的getter方法。

+0

您是否尝试过它的参考访问? –

+0

你怎么不能初始化一个'static final'变量? –

回答

4

接口中的字段声明是implicitlypublic 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

相关问题