【发布时间】:2018-03-08 08:13:30
【问题描述】:
我想创建一个接口,强制所有实现它的类定义一个静态的最终整数变量:
public interface FooInterface {
static final int bar;
}
但是编译器说“变量'bar'可能没有被初始化”。为什么我必须在界面中给它一个值?我希望每个实现都定义自己的值,所以对我来说,我必须放一些永远不会使用的任意数字似乎不合逻辑。
【问题讨论】:
我想创建一个接口,强制所有实现它的类定义一个静态的最终整数变量:
public interface FooInterface {
static final int bar;
}
但是编译器说“变量'bar'可能没有被初始化”。为什么我必须在界面中给它一个值?我希望每个实现都定义自己的值,所以对我来说,我必须放一些永远不会使用的任意数字似乎不合逻辑。
【问题讨论】:
你不能用界面来做到这一点。接口中的所有变量都隐含为public final static。
您可以在接口中定义int getBar();,然后所有实现类都需要返回一个值。
您有责任确保实现者表现良好,但您不能阻止实现返回不同的值,例如
public class Foo implements Bar {
public int getBar() {
return (int) System.currentTimeMillis();
}
}
【讨论】:
abstract static 的概念,很多其他语言很容易支持。
你从错误的角度考虑这个问题。
static final 不能在实现类中被覆盖。
你可能想这样做:
public interface FooInterface {
int getBar();
}
【讨论】:
你不能那样做。接口只能强制实现它的类实现方法。
接口中定义的静态变量属于接口。它不会强制实现类声明相同的变量。
【讨论】:
接口中的每个变量都是静态的和最终的。 final 变量必须在第一行或构造函数中初始化。因为接口没有构造函数,所以必须在第一行初始化 final 变量。
【讨论】:
因为它们是最终变量,需要初始化最终变量。
【讨论】:
在普通类中,我们可以选择这样定义它并在静态初始化块中初始化它的值:
public class FooClass {
static final int bar;
static {
bar = 5;
}
}
在接口的情况下,不允许静态初始化块,这就是 Java 要求在声明时将其设置为值的原因。
【讨论】: