JLS 2.13.1界面修饰符
接口不能是最终的,因为这样的类的实现永远无法完成。
如果我可以在接口I中编写创建静态内部类,可以在其中提供实现,那么为什么会有这样的限制
interface Type {
// Normal
class Value {
private Value() {
}
public void print() {
System.out.println("Test");
}
}
public final Value value = new Value();
}
答案 0 :(得分:9)
在接口中你根本不能提供任何形式的实现:甚至不是静态方法。使任何方法最终都没有意义,因为它们还没有实现。
如果说我有一个名为IExample
的接口及其具体实现Example
:
interface IExample{
public final void run();
}
class Example implements IExample{
// wait! I can't override because it's final! but it's yet to be implemented?!
public void run(){
}
}
答案 1 :(得分:4)
BTW:首次定义此限制时,嵌套类不可用,所以问题可能就是为什么没有解除此限制。
final
类不能包含任何子类。仅使用接口来定义子类的方法被认为是最佳实践,因此这两者是矛盾的。
您可以将界面用于其他事情
但这些都是接口的附带目的。
答案 2 :(得分:1)
“当最终关键字出现在类声明中时,意味着该类可能永远不会被子类化或被覆盖。这可以防止特定类的过度专业化。在某种意义上,创建该类的人会考虑进一步的更改与其主要目的相切。“
参考:Final
接口代表行为,而不是实现,因此它最终是没有意义的。
答案 3 :(得分:0)
如果我可以在接口I中编写创建静态内部类,可以在其中提供实现,那么为什么会有这样的限制
是的,您可以在那里声明一个内部类,但仍然指出final
接口是一个无法实现的接口。任何实现它的类都将违反final
限制。 Java设计者得出结论认为这没有多大意义,因为对于嵌套类 * 的final
接口没有令人信服的用例,所以没有理由放宽这种限制。
* - 我不会声称无法发明用例。但是,我从未听说过人们使用内部类编写接口,其目的是接口应该不能实现。