为什么界面不能最终?

时间:2012-09-10 12:23:26

标签: java interface

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();
}

4 个答案:

答案 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类不能包含任何子类。仅使用接口来定义子类的方法被认为是最佳实践,因此这两者是矛盾的。

您可以将界面用于其他事情

  • 注释
  • 的javadocs
  • 常数
  • 仅定义嵌套类。

但这些都是接口的附带目的。

答案 2 :(得分:1)

“当最终关键字出现在类声明中时,意味着该类可能永远不会被子类化或被覆盖。这可以防止特定类的过度专业化。在某种意义上,创建该类的人会考虑进一步的更改与其主要目的相切。“

参考:Final

接口代表行为,而不是实现,因此它最终是没有意义的。

答案 3 :(得分:0)

  

如果我可以在接口I中编写创建静态内部类,可以在其中提供实现,那么为什么会有这样的限制

是的,您可以在那里声明一个内部类,但仍然指出final接口是一个无法实现的接口。任何实现它的类都将违反final限制。 Java设计者得出结论认为这没有多大意义,因为对于嵌套类 * final接口没有令人信服的用例,所以没有理由放宽这种限制。

* - 我不会声称无法发明用例。但是,我从未听说过人们使用内部类编写接口,其目的是接口应该不能实现。